我有一个ASP.NET MVC 5网站与自己的认证。每个用户在基础数据库中都有不同的凭据,该数据库还用于通过自定义UserManager对用户进行身份验证。在UserManager.FindAsync返回之前,我将用户名/密码存储在会话状态,因为应用程序需要在同一用户随后的任何请求中使用它们进行数据库访问。
当会话丢失(例如,AppDomain回收)时,凭据将随之丢失。但是Owin继续对用户进行身份验证,可能是基于浏览器发送的cookie。我最终得到的是一个经过认证的用户..。没有会话,因此没有数据库凭据。
再现这种行为的最简单的方法是创建一个新的ASP.NET MVC 5应用程序,并使用单个用户帐户身份验证,并在AccountController.SignInAsync方法的末尾添加一些会话数据。
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
HttpContext.Session["Data"] = "Data";
}然后,尝试在任何控制器中检索此信息。
public ActionResult About()
{
ViewBag.Message = Session["Data"];
return View();
}数据将在用户登录后出现。但是,如果您保持打开浏览器(对于cookie),重新启动开发服务器并刷新页面,则在数据消失时,用户仍然是经过身份验证的。
我知道这种行为并不意外,但我正在寻找一种可靠和集中的方式来强制重定向到登录页面,当会话由于任何其他原因过期或消失时。
发布于 2014-04-07 12:39:01
将cookie过期设置为与会话超时值相同的持续时间。此外,您还需要确保到期类型(滑动或不滑动)是相同的。使用非滑动到期可能会有更好的结果,以确保他们同时超时。
https://stackoverflow.com/questions/22910874
复制相似问题