使用FormsAuthentication.SetAuthCookie存储更多信息

时间:2009-07-19 14:20:14

标签: c# asp.net asp.net-mvc forms-authentication

我正在使用aspx和c#来设置登录的身份验证cookie。

FormsAuthentication.SetAuthCookie(UserName, True)

我想在同一个Cookie中存储更多信息。我可以为此身份验证Cookie添加值,还是必须使用第二个http cookie?

基本上我正在寻找存储用户的Id所以我可以使用users表行键访问数据库

谢谢, 伊甸

5 个答案:

答案 0 :(得分:47)

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

the MSDN documentation for FormsAuthenticationTicket中有一个例子。

修改

请注意,在创建故障单时,您需要设置超时,通常您需要与web.config中配置的值相同。不幸的是,在Framework 3.5或更早版本中,FormsAuthentication类不公开公开此超时。要获得解决方法,请使用对this connect feedback item的响应中描述的技术之一。

<强>更新

  

令人遗憾的是,连接反馈项目不再存在。希望你简要介绍一下这些技术是什么。

是的,很遗憾微软已经放弃了历史性的Connect项目。 IIRC,他们建议的两种技术是:

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

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

  3. 或升级到.NET 4.x,其中有FormsAuthentication.Timeout属性。

    有关详细信息,请参阅this question

答案 1 :(得分:15)

只要对您有用,您就可以在auth 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;
    }
}

答案 2 :(得分:3)

是的,使用“|”是明智的提供更多信息。如果Microsoft有另一个重载方法

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

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

答案 3 :(得分:1)

将该用户ID作为userName参数传递。

FormsAuthentication.SetAuthCookie(userId, True)

您如何保护您的身份证明票?

答案 4 :(得分:0)