我们目前正在构建一个使用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分钟。我们可以同步它们,所以它们是相同的值吗?或者我们不应该将两者混合在一起?
答案 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
}