UseCookieAuthentication和SessionTimeout

时间:2014-12-22 16:08:48

标签: asp.net asp.net-mvc

我们目前正在构建一个使用Cookie身份验证的MVC 4应用程序,使用Owin,我们在启动类中使用它。

        public void ConfigureAuth(IAppBuilder app)
    {
        // Enable the application to use a cookie to store information for the signed in user
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            ExpireTimeSpan = TimeSpan.FromMinutes(30)   // users requested timeout be increased to 30 mins
        });

        //***************************** Specific to our App **************************************************
        //This is requrired to tell AntiForgeryConfig to use NameIdentifier as a unique key to validate against 
        AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;

    }

另一个从事这个项目的开发人员希望在Session中存储一个值,但是在调试时我们注意到会话超时设置为20分钟。我们可以同步它们,所以它们是相同的值吗?或者我们不应该将两者混合在一起?

1 个答案:

答案 0 :(得分:0)

您的会话超时在Web.config中处理,而Owin cookie超时由库处理,如您在示例中所述。

您的会话超时在web.config中设置如下:

<system.web>
   <sessionState timeout="60"  />
</system.web>

据我所知,没有办法同步这2次超时。

解决这个问题的方法可能是将sessionState设置为比Owin ExpireTimeSpan更低的数字,并在控制器上使用自定义ActionAttribute,检查会话是否超时 - 然后你可以做什么你要。它可以是一个非常容易实现的解决方案,看起来像这样:

public class RedirectingActionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var session = HttpContext.Current.Session["SessionVar"];

        //Redirects user to login screen if session has timed out
        if (session == null)
        {
            base.OnActionExecuting(filterContext);


            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Index"
            }));
        }

    } 
}

只要在范围内调用具有以下ActionAttribute的控制器,就会调用上面的方法:

[RedirectingAction]
public class HomeController : Controller
{
//Controller code
}