我正在创建一个使用自定义逻辑的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
是要走的路。
答案 0 :(得分:1)
分配用户将起作用,但此分配不会在请求之间保留。您必须确保在每个请求开头设置用户,可能是自定义AuthorizeAttribute
或IHttpModule
。例如,您可能具有以下逻辑:
此外,当您指定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"];