我正在开发一个C#MVC应用程序,我似乎无法得到认证和会话超时同步。 我有一个基本的窗体身份验证设置和一些有限的会话值。 我设置了认证超时小于会话(28分钟比30),但对开发网络服务器上运行,该会议将在服务器重新启动被消灭而认证支左右。 我假设的验证被存储在明显生存的服务器重启的cookie。
<authentication mode="Forms" >
<forms loginUrl="~/Account/Login" timeout="28" />
</authentication>
<sessionState timeout="30" />
我想我要强制认证超时如果会话为null,则然后强制登录。
难道这就是我真正想要做什么? 如果是如何以及在哪里办呢?
如果不是,什么是处理这个问题的正确方法?
编辑
对于一个多角度的我还张贴了这个同一项目这样一个问题: 登录为...最佳做法?
我发现我的答案。 重写授权属性。 这似乎是最优雅的方法:
public class AuthorizeWithSessionAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext.Session == null || httpContext.Session["CurrentUser"] == null)
return false;
return base.AuthorizeCore(httpContext);
}
}
你可以用的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;
}
}
}
}
或者,你可以写一个HTTP模块和实施context_AuthenticateRequest
,以检查是否存在会话,并相应地处理请求。
希望帮助。
编辑由Valamas
见回答https://stackoverflow.com/a/1446575/511438与会话错误的帮助。