7

我正在使用 ASP.NET 登录控件。我希望能够为每个用户单独设置表单身份验证的超时时间(而不是在 web.config 中全局设置)。据我了解,唯一的方法是手动设置 AuthenticationTicket 的超时时间。使用登录控件时有没有办法做到这一点?在我看来,登录控件抽象了所有这些。我希望有一些方法可以继续使用登录控件,而且还能够为每个用户单独设置 FormsAuthentication 超时。

谢谢,科里

4

2 回答 2

7

MSDN

在身份验证提供程序检查用户的凭据并且身份验证 cookie 排队等待在下一个响应中发送到浏览器之后,将引发 LoggedIn 事件。在用户通过身份验证后,使用 LoggedIn 事件提供额外的处理,例如访问每个用户的数据。

所以这个事件似乎是替换cookies的正确地方。首先,需要检索和解密 cookie:

HttpCookie authCookie = Response.Cookies[FormsAuthentication.FormsCookieName];
FormsAuthenticationTicket oldAuthTicket = 
    FormsAuthentication.Decrypt(authCookie.Value);

在此之后,应创建基于刚刚提取的新身份验证票证:

FormsAuthenticationTicket newAuthTicket = new FormsAuthenticationTicket(
    oldAuthTicket.Version,
    oldAuthTicket.Name,
    DateTime.Now,
    DateTime.Now.Add(timeoutForUser),
    oldAuthTicket.IsPersistent,
    oldAuthTicket.UserData,
    FormsAuthentication.FormsCookiePath
);

timeoutForUser这是一个TimeSpan保存用户会话超时的值。

最后,应将响应中的旧 cookie 替换为新 cookie:

string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
authCookie = 
    new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
HttpContext.Current.Response.Cookies.Set(authCookie);

这应该可以解决问题。

于 2011-03-11T20:23:58.237 回答
2

登录控件具有可用于自己处理身份验证的事件LoggingInLoggedIn

LoggingIn您可以通过设置取消事件中的登录过程,e.Cancel = True然后使用 new 手动创建票证new FormsAuthenticationTicket(...)

于 2011-03-11T19:53:27.557 回答