虽然会话丢失,但Owin仍会对用户进行身份验证

时间:2014-04-07 11:18:12

标签: asp.net asp.net-mvc asp.net-identity owin

我有一个带有OWIN身份验证的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),重新启动开发服务器并刷新页面,则在数据消失时用户仍会进行身份验证。

我知道这种行为并不出人意料,但我正在寻找一种可靠而集中的方式,在会话过期或因任何其他原因消失时强制重定向到登录页面。

1 个答案:

答案 0 :(得分:3)

将Cookie过期设置为与会话超时值相同的持续时间。此外,您还需要确保过期类型(滑动或非滑动)相同。使用非滑动过期可能会更好地确保它们同时超时。