我正在使用FormsAuthentication,我在设置TimeOut值时遇到问题。
我已经看过其他一些与此相关的帖子,但它们似乎不是我的问题,或者建议的解决方案无效。
我的web.config包含以下内容:
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn"
timeout="1"
cookieless="UseCookies" />
</authentication>
我已将AuthorizeAttribute放在我想要保护的控制器上。
我可以查看.ASPXAUTH cookie(使用FireCookies),我可以看到它设置为在登录后1分钟到期。
如果我通过我的代码调试,我可以看到FormsAuthentication.Timeout = 1。
但是我的门票在1分钟内似乎没有超时。在1分钟不活动后,我仍然可以使用AuthorizeAttribute浏览到控制器。
实际上我实际上可以使用FireCookies删除.ASPXAUTH cookie,我仍然可以使用AuthorizeAttribute浏览到控制器。
长时间不活动后很奇怪(抱歉没有确切的时间 - 我外出吃午饭!)TimeOut发生了,我被重定向 登录屏幕。
有什么想法吗?
答案 0 :(得分:10)
我也有同样的问题。实际上,它是因为我无法从javascript中读取表单身份验证cookie,过了一段时间undefined
。我只是想知道我是否通过javascript进行了身份验证。
后来我发现机票已经过期,但我没有退出(也是。所以我也想解决这个问题)!我看到你的问题没有得到解答,所以我把问题保持开放了半天。以下是我提出的似乎正在起作用的内容。
我的答案基于这个答案。用户 ScottS
https://stackoverflow.com/a/454639/511438这是我的ASP.NET MVC 3项目。
这是我的登录代码。未显示,之前的自定义用户身份验证逻辑。这只是设置初始票。
公共类FormsAuthenticationService:IFormsAuthentication
public void SignIn(string userName, bool createPersistentCookie, string role)
{
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1, // version
userName, // user name
DateTime.Now, // created
DateTime.Now.Add(FormsAuthentication.Timeout), // expires
false, // rememberMe?
role // can be used to store roles
);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
HttpContext.Current.Response.Cookies.Add(authCookie);
}
在同一个类中,但是从global.asax
访问的静态方法//-- this is based on https://stackoverflow.com/questions/454616/asp-net-cookies-authentication-and-session-timeouts
internal static FormsAuthenticationTicket RefreshLoginCookie(bool retainCurrentExpiry)
{
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null || authCookie.Value == null)
return null;
FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value);
DateTime expiryDate = (retainCurrentExpiry ? oldTicket.Expiration : DateTime.Now.Add(FormsAuthentication.Timeout));
HttpContext.Current.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
var newTicket = new FormsAuthenticationTicket(oldTicket.Version, oldTicket.Name, oldTicket.IssueDate, expiryDate,
oldTicket.IsPersistent, oldTicket.UserData, oldTicket.CookiePath);
HttpCookie newAuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(newTicket));
HttpContext.Current.Response.Cookies.Add(newAuthCookie);
return newTicket;
}
<强> Global.asax中强>
我的自定义是ajax请求不刷新表单身份验证票证。因此,如果您坐在那里超时,ajax请求会将您注销。如果你想让ajax请求保持票证活着(更改我的javascript cookie问题,而不是你的注销不活动问题),请更改。 *(提示,如果您注销,然后登录,但再次返回登录页面,第一次登录可能没有在查询字符串中指定returnUrl)。 *
protected virtual void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null || authCookie.Value == "")
{
return;
}
bool isAjax = new HttpRequestWrapper(System.Web.HttpContext.Current.Request).IsAjaxRequest();
FormsAuthenticationTicket authTicket;
try
{
//-- THIS IS WHAT YOU WANT
authTicket = FormsAuthenticationService.RefreshLoginCookie(isAjax);
}
catch
{
return;
}
string[] roles = authTicket.UserData.Split(';');
if (Context.User != null) Context.User = new GenericPrincipal(Context.User.Identity, roles);
}
<强>的Web.config 强> 这是我设置会话超时和票证超时的部分
<configuration>
<system.web>
<sessionState mode="InProc" timeout="60" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="60" name="ProviderMvcSession" cookieless="UseCookies" />
</authentication>
答案 1 :(得分:0)
这是关于会话超时的时间。默认值为20分钟,您可以在web.config中更改它,如下所示:
<sessionState mode="InProc" timeout="20"/>
答案 2 :(得分:0)
一个显而易见的解决方案可以让一些人轻松查看,清除浏览器cookie或注销可以解决问题。如果选中“记住我”,则无论对Web.Config超时值所做的更改,应用程序都将继续使用旧cookie登录。