【问题标题】:Owin still authenticates the user although the session was lost尽管会话丢失,Owin 仍然对用户进行身份验证
【发布时间】:2014-05-19 14:31:05
【问题描述】:

我有一个带有 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),重新启动开发服务器并刷新页面,用户仍然可以通过身份验证,而数据已经消失。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这当然可以缓解问题,就像使用非 InProc 会话状态模式一样。尽管如此,问题还是发生在开发中或服务器重新启动时。我发现我的问题与这个问题非常相似:How to log out a user when a session times out or ends.
    • @MathieuRenda - QA 提供的答案与我提供的相同。不知道你在找什么。
    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2017-05-05
    相关资源
    最近更新 更多