存储使用FormsAuthentication.SetAuthCookie更多信息(Storing

2019-06-17 11:11发布

我使用的aspx和c#的设置身份验证cookie进行登录。

FormsAuthentication.SetAuthCookie(UserName, True)

我想存储在相同的cookie的更多信息。 我可以添加值到这个身份验证Cookie或做我必须使用第二HTTP cookie的?

基本上我寻找而去存储用户的Id ,所以我可能能够访问使用用户表行键数据库

谢谢,伊甸园

Answer 1:

您可以将用户数据添加到的FormsAuthenticationTicket,然后生成自己的cookie的。

还有的在示例MSDN文档的FormsAuthenticationTicket 。

编辑

请注意,在创建时票,你需要设置超时时间,这在一般你会希望同在web.config中配置的值。 不幸的是,框架3.5或更早的版本, FormsAuthentication类不公开揭露此超时。 有关解决方法,使用在响应于所描述的技术中的一种这样连接反馈项 。

UPDATE

连接反馈产品,就不再出现了,可悲。 希望你简要介绍一下技术是。

是的,这是一个遗憾微软已经抛弃的历史连接的项目。 IIRC,这两种技术他们建议是:

  1. 使用WebConfigurationManager读取相关的配置部分,并获得超时值。

  2. 创建使用Cookie FormsAuthentication.GetAuthCookie ,解密用FormsAuthentication.Decrypt并检查产生FormsAuthenticationTicket

或升级到.NET 4.x的,那里是一个FormsAuthentication.Timeout财产。

见这个问题的更多信息



Answer 2:

只要是对你有用,你可以把任何你想要在身份验证cookie中。 这就是说,如果你把你应该敏感信息,至少是,加密,但我不推荐把敏感信息那里。 你可以这样做:

Forms.SetAuthCookie (UserName + "|" + UserId, true);

然后,当你需要的用户名或用户ID,它的存在。 只是加载cookie并解析出你需要的值。

同样, 我建议反对这样做,特别是因为我上面提供 。 这就是说,它是可能的。 你应该创建存取方法来提取数据退了出来:

public int CurrentUserId
{
    get
    {
        int userId = 0;

        if (HttpContext.Current.Request.IsAuthenticated)
        {
            userId = Convert.ToInt32(HttpContext.Current.User.Identity.Name.Split('|')[1]);
        }

        return userId;
    }
}

public string CurrentUserName
{
    get
    {
        string userName = string.Empty;

        if (HttpContext.Current.Request.IsAuthenticated)
        {
            userName = HttpContext.Current.User.Identity.Name.Split('|')[0];
        }

        return userName;
    }
}


Answer 3:

是的,它是明智的使用“|” 把更多的信息。 如果微软有另一个重载方法

public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)`

然后,我们的生活会容易得多,我们的代码将更加安全。



Answer 4:

传递用户ID作为用户名PARAM。

FormsAuthentication.SetAuthCookie(userId, True)

你是如何保护您的身份验证票?



Answer 5:

你可以存储在附加信息UserData的财产FormsAuthenticationTicket

using Newtonsoft.Json;
using System.Web;
using System.Web.Security;

public class LoggedInUser
{
    public string FirstName { get; set; } = null;
    public bool IsAdmin { get; set; } = false;
}

public static class Authentication
{
    static void SignIn(
        HttpContextBase context,
        string emailAddress,
        bool rememberMe,
        LoggedInUser user = null)
    {
        var cookie = FormsAuthentication.GetAuthCookie(
            emailAddress.ToLower(),
            rememberMe);
        var oldTicket = FormsAuthentication.Decrypt(cookie.Value);
        var newTicket = new FormsAuthenticationTicket(
            oldTicket.Version,
            oldTicket.Name,
            oldTicket.IssueDate,
            oldTicket.Expiration,
            oldTicket.IsPersistent,
            JsonConvert.SerializeObject(user ?? new LoggedInUser()));

        cookie.Value = FormsAuthentication.Encrypt(newTicket);

        context.Response.Cookies.Add(cookie);
    }

    static void SignOut(HttpContextBase context)
    {
        FormsAuthentication.SignOut();
    }

    static LoggedInUser GetLoggedInUser()
    {
        if (HttpContext.Current.User?.Identity?.Name != null && HttpContext.Current.User?.Identity is FormsIdentity identity)
            return JsonConvert.DeserializeObject<LoggedInUser>(identity.Ticket.UserData);

        return new LoggedInUser();
    }
}

延伸阅读: https://docs.microsoft.com/en-us/aspnet/web-forms/overview/older-versions-security/introduction/forms-authentication-configuration-and-advanced-topics-cs#step-4 -storing-附加用户数据内式票



文章来源: Storing more information using FormsAuthentication.SetAuthCookie