【发布时间】: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