Jos*_*sso 9 asp.net-mvc forms-authentication session-timeout
我正在开发一个C#MVC应用程序,我似乎无法获得身份验证和会话超时来同步.我有一个基本的表单身份验证设置和一些有限的会话值.我将身份验证超时设置为小于会话(28分钟对30),但是对开发Web服务器运行时,会在重新启动服务器时擦除会话,但身份验证仍然存在.我假设认证存储在一个cookie中,显然可以在服务器重启后继续存在.
<authentication mode="Forms" >
<forms loginUrl="~/Account/Login" timeout="28" />
</authentication>
<sessionState timeout="30" />
Run Code Online (Sandbox Code Playgroud)
我想如果Session为null,我想强制认证超时,然后强制登录.
那是我真正想做的吗?如果是这样,我该怎么做?
如果没有,处理这个问题的正确方法是什么?
编辑
对于更多的观点,我也为同一个项目发布了这个问题:登录为......最佳实践?
Jos*_*sso 14
我找到了答案.覆盖Authorize属性.这似乎是最优雅的方法:
public class AuthorizeWithSessionAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext.Session == null || httpContext.Session["CurrentUser"] == null)
return false;
return base.AuthorizeCore(httpContext);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用PreRequestHandlerExecute事件处理程序在global.asax中处理此问题
protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
//Check if user is authenticated
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (!authTicket.Expired)
{
if (Session["XYZ"] == null)
{
//Session is null, redirect to login page
FormsAuthentication.SignOut();
Response.Redirect(FormsAuthentication.LoginUrl, true);
return;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以编写Httpmodule并实现context_AuthenticateRequest以检查会话是否存在并相应地处理请求.
希望有所帮助.
由Valamas编辑
有关会话错误的帮助,请参阅答案/sf/answers/101260281/.
| 归档时间: |
|
| 查看次数: |
9134 次 |
| 最近记录: |