【问题标题】:Cannot get variable I assigned to HttpContext.User无法获取我分配给 HttpContext.User 的变量
【发布时间】:2014-03-25 11:01:00
【问题描述】:

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

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");
   }
}

然后,在索引操作中:

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

我得到的错误是:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    分配用户将起作用,但此分配不会在请求之间持续存在。您必须确保在每个请求开始时设置用户,可能在自定义AuthorizeAttributeIHttpModule 中。例如,您可能有如下逻辑:

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

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

    【讨论】:

    • 谢谢。进一步阅读,我发现 HttpContext 在对控制器的调用之间不会持续存在。我发现 MVC4 对此感到非常沮丧,当它存在以简化开发过程时,它使一个简单的任务变得复杂。我打算去实现一个糟糕的 Session 实现,因为这完全是浪费时间。
    【解决方案2】:

    阅读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"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      相关资源
      最近更新 更多