我正在使用 ASP.NET 登录控件。我希望能够为每个用户单独设置表单身份验证的超时时间(而不是在 web.config 中全局设置)。据我了解,唯一的方法是手动设置 AuthenticationTicket 的超时时间。使用登录控件时有没有办法做到这一点?在我看来,登录控件抽象了所有这些。我希望有一些方法可以继续使用登录控件,而且还能够为每个用户单独设置 FormsAuthentication 超时。
谢谢,科里
我正在使用 ASP.NET 登录控件。我希望能够为每个用户单独设置表单身份验证的超时时间(而不是在 web.config 中全局设置)。据我了解,唯一的方法是手动设置 AuthenticationTicket 的超时时间。使用登录控件时有没有办法做到这一点?在我看来,登录控件抽象了所有这些。我希望有一些方法可以继续使用登录控件,而且还能够为每个用户单独设置 FormsAuthentication 超时。
谢谢,科里
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);
这应该可以解决问题。
登录控件具有可用于自己处理身份验证的事件LoggingIn。LoggedIn
LoggingIn您可以通过设置取消事件中的登录过程,e.Cancel = True然后使用 new 手动创建票证new FormsAuthenticationTicket(...)