我正在使用MVC 3,我刚刚为FormsAuthenticationService实现了一个包装器。
类似于以下内容。
public void SignIn(string username, bool createPersistantCookie)
{
if (string.IsNullOrEmpty(username))
throw new ArgumentException("Value Cannot be null or empty", "username");
FormsAuthentication.SetAuthCookie(username, createPersistantCookie);
}
不情愿地,我已经开始工作,但现在我不太确定如何获取我存储的信息。
一旦用户进入我的系统,如果我需要从数据库中取出他们的UserID,我现在如何能够安全地检索这些信息?
答案 0 :(得分:4)
根据提供的其他信息,您希望使用FormsAuthentication票证存储其他数据。为此,您需要首先创建自定义FormsAuthentication票证:
存储数据
抓住当前的HttpContext(不用担心可测试性)
var httpContext = HttpContext.Current;
确定故障单何时到期:
var expires = isPersistent
? DateTime.Now.Add(FormsAuthentication.Timeout)
: NoPersistenceExpiryDate; // NoPersistenceExpiryDate = DateTime.MinValue
创建一个新的FormsAuthentication票证以保存您的自定义数据。
var authenticationTicket = new FormsAuthenticationTicket(
1,
username,
DateTime.Now,
DateTime.Now.Add(FormsAuthentication.Timeout),
isPersistent,
"My Custom Data String"); //Limit to about 1200 bytes max
创建您的HTTP Cookie
new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authenticationTicket))
{
Path = FormsAuthentication.FormsCookiePath,
Domain = FormsAuthentication.CookieDomain,
Secure = FormsAuthentication.RequireSSL,
Expires = expires,
HttpOnly = true
};
最后添加回复
httpContext.Response.Cookies.Add(cookie);
检索数据
然后,您可以通过解析存储的身份验证票证来检索后续请求中的数据......
再次,抓住当前的HttpContext
var httpContext = HttpContext.Current
检查请求是否已经过身份验证(在Application_AuthenticateRequest或OnAuthorize中调用)
if (!httpContext.Request.IsAuthenticated)
return false;
检查您是否有可用的FormsAuthentication票证以及它是否已过期:
var formsCookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
if (formsCookie == null)
return false;
检索FormsAuthentication票证:
var authenticationTicket = FormsAuthentication.Decrypt(formsCookie.Value);
if (authenticationTicket.Expired)
return false;
最后检索您的数据:
var data = authenticationTicket.UserData;
答案 1 :(得分:1)
您实际上并未在数据库中存储用户ID。您编写的所有代码都是在用户计算机上存储身份验证cookie,可以是会话cookie(非持久性),也可以是持久性cookie。
当您的页面刷新时,它将自动获取cookie,对其进行解码,并填充您从控制器的User.Current
属性访问的IPrincipal对象。