尽可能避免使用会话,如果不使用会话可以使多服务器部署变得更加容易。也许,名称和电子邮件是cookie的容易选择。很容易伪造cookie,根据您的安全性需求,userID可能不是一个好主意。
表单身份验证cookie是加密的,您可以向这些cookie添加额外的数据(详见下文)。它可能是可破解的,但远不像简单cookie那样容易。下面是我过去使用的代码,稍作修改以删除一些项目特定的细节。在登录控件的LoggedIn事件中调用此代码。
void AddUserIDToAuthCookie(string userID)
{
HttpCookie authCookie = Response.Cookies[AUTH_COOKIE];
if(authCookie == null)
{
return;
}
Response.Cookies.Remove(AUTH_COOKIE);
FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value);
var newTicket =
new FormsAuthenticationTicket(oldTicket.Version, oldTicket.Name, oldTicket.IssueDate, oldTicket.Expiration,
oldTicket.IsPersistent, userID, oldTicket.CookiePath);
authCookie.Value = FormsAuthentication.Encrypt(newTicket);
Response.Cookies.Add(authCookie);
}
顺便说一句,我从一个旧项目中复制了这个代码,并在这里进行了编辑以删除一些特定于该项目的部分,因此它可能无法编译,但非常接近。
要在您的网页中获取ID...
FormsAuthenticationTicket ticket = ((FormsIdentity) Page.User.Identity).Ticket
string id = ticket.UserData
我使用这种机制来存储一个不是 aspnetdb 用户数据的 id。如果所有身份数据都由 aspnetdb 处理,您可能只需要访问 Page.User.Identity 对象。
HttpCookie authCookie = Response.Cookies[AUTH_COOKIE];
应该改为Request.Cookies
。 - Valamas