我正在使用FormsAuthentication,我在设置TimeOut值时遇到问题.
我已经看到了一些与此相关的其他帖子,但它们似乎不是我的问题,或者建议的解决方案没有帮助.
我的web.config有以下内容:
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn"
timeout="1"
cookieless="UseCookies" />
</authentication>
Run Code Online (Sandbox Code Playgroud)
我已将AuthorizeAttribute放在我想要保护的控制器上.
我可以查看.ASPXAUTH cookie(使用FireCookies),我可以看到它设置为在登录后1分钟到期.
如果我通过我的代码调试,我可以看到FormsAuthentication.Timeout = 1.
但是我的票在1分钟内似乎没有超时.在1分钟不活动后,我仍然可以使用AuthorizeAttribute浏览到控制器.
事实上,我实际上可以使用FireCookies删除.ASPXAUTH cookie,我仍然可以使用AuthorizeAttribute浏览到控制器.
长时间不活动后很奇怪(抱歉没有确切的时间 - 我外出吃午饭!)TimeOut发生,我被重定向到登录界面.
有任何想法吗?
Val*_*mas 10
我也有同样的问题.实际上,它的出现是因为我无法从javascript中读取表单身份验证cookie,过了一段时间undefined.我只是想知道我是否通过javascript进行身份验证.
后来我发现机票已经过期,但我没有登出(也是.所以我也想解决这个问题)!我看到你的问题没有得到解答,所以我把问题保持开放了半天.以下是我提出的似乎正在起作用的内容.
我的答案基于这个答案.用户ScottS的/sf/answers/31824761/
这是在我的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);
}
Run Code Online (Sandbox Code Playgroud)
在同一个类中,但是从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;
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
这里的Web.config是我设置会话超时和票证超时的部分
<configuration>
<system.web>
<sessionState mode="InProc" timeout="60" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="60" name="ProviderMvcSession" cookieless="UseCookies" />
</authentication>
Run Code Online (Sandbox Code Playgroud)
这是关于你的会话超时时间是多长。默认值为 20 分钟,您可以在 web.config 中更改它,如下所示:
<sessionState mode="InProc" timeout="20"/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11933 次 |
| 最近记录: |