使用FormsAuthentication.SetAuthCookie存储更多信息

Ede*_*den 43 c# asp.net asp.net-mvc forms-authentication

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

FormsAuthentication.SetAuthCookie(UserName, True)
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,伊甸园

Joe*_*Joe 48

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

FormsAuthenticationTicket的MSDN文档中有一个示例.

编辑

请注意,在创建故障单时,您需要设置超时,通常您需要与web.config中配置的值相同.不幸的是,在Framework 3.5或更早版本中,FormsAuthentication该类不公开公开此超时.有关解决方法,请使用此连接反馈项的响应中描述的技术之一.

UPDATE

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

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

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

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

或升级到FormsAuthentication.Timeout有财产的.NET 4.x.

有关详细信息,请参阅此问题


and*_*ows 15

你可以在auth cookie中放入任何你想要的东西,只要它对你有用.也就是说,如果您要提供敏感信息,至少应该对其进行加密,但我建议不要将敏感信息放在那里.你可以这样做:

Forms.SetAuthCookie (UserName + "|" + UserId, true);
Run Code Online (Sandbox Code Playgroud)

然后,只要您需要用户名或用户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;
    }
}
Run Code Online (Sandbox Code Playgroud)