我正在使用aspx和c#来设置登录的身份验证cookie。
FormsAuthentication.SetAuthCookie(UserName, True)
我想在同一个Cookie中存储更多信息。我可以为此身份验证Cookie添加值,还是必须使用第二个http cookie?
基本上我正在寻找存储用户的Id
所以我可以使用users表行键访问数据库
谢谢, 伊甸
答案 0 :(得分:47)
您可以将用户数据添加到FormsAuthenticationTicket,然后自己生成cookie。
the MSDN documentation for FormsAuthenticationTicket中有一个例子。
修改强>
请注意,在创建故障单时,您需要设置超时,通常您需要与web.config中配置的值相同。不幸的是,在Framework 3.5或更早版本中,FormsAuthentication
类不公开公开此超时。要获得解决方法,请使用对this connect feedback item的响应中描述的技术之一。
<强>更新强>
令人遗憾的是,连接反馈项目不再存在。希望你简要介绍一下这些技术是什么。
是的,很遗憾微软已经放弃了历史性的Connect项目。 IIRC,他们建议的两种技术是:
使用WebConfigurationManager读取相关配置部分并获取超时值。
使用FormsAuthentication.GetAuthCookie
创建Cookie,使用FormsAuthentication.Decrypt
解密并检查生成的FormsAuthenticationTicket
。
或升级到.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)
您可以在UserData
的{{1}}属性中存储其他信息:
FormsAuthenticationTicket