无法获取我分配给HttpContext.User的变量

时间:2014-03-25 11:01:01

标签: c# asp.net-mvc asp.net-mvc-4 authorization

我正在创建一个使用自定义逻辑的MVC 4的基本身份验证系统。我有一个UserModel类(继承自IPrincipal),它存储了我需要持久化的数据。为此,我在Controller中使用以下代码:

if (ModelState.IsValid)
{
   if (userModel.IsValidUser())
   {
      FormsAuthentication.SetAuthCookie(userModel.Username, false);
      HttpContext.User = userModel;
      // User is now logged in; send them to Index method to load MyeMan data
      return RedirectToAction("Index", "Login");
   }
}

然后,在Index动作中:

if (IsUserLoggedIn())
{
   UserModel userModel = (UserModel) HttpContext.User; // This line throws error
}

我得到的错误是:

  

无法将“System.Web.Security.RolePrincipal”类型的对象强制转换为   输入'MyProj.UserModel'。

当我查看调试时,HttpContext.User会毫无怨言地接受UserModel。只有当它重定向到不同的动作时,它的数据类型才会改变。

我做错了什么,或者这是完全错误的方式在没有Sessions的情况下坚持存储UserModel?会话将独立于AuthCookie到期;我被告知HttpContext.User是要走的路。

2 个答案:

答案 0 :(得分:1)

分配用户将起作用,但此分配不会在请求之间保留。您必须确保在每个请求开头设置用户,可能是自定义AuthorizeAttributeIHttpModule。例如,您可能具有以下逻辑:

  • 从请求中检索相关的Cookie
  • 验证cookie是否与有效会话相对应(例如,通过查询包含此信息的数据库)
  • 根据cookie检索会话信息并将其存储在User属性

此外,当您指定HttpContext.Current.User时,请考虑分配Thread.CurrentPrincipal

答案 1 :(得分:0)

阅读 Passing Data in an ASP.NET MVC Application

您可以使用TempData在操作之间传递数据。它仅适用于后续请求

  TempData["User"] = userModel;
  // User is now logged in; send them to Index method to load MyeMan data
  return RedirectToAction("Index", "Login");

在索引

 UserModel user= (UserModel)TempData["User"];