8

我声明要为我的 ASP.Net MVC 4 站点找出 SimpleMembership。我用自定义属性 AccountTypeId 扩充了 UserProfile。我已经使用增强属性更新了数据库表,并且可以在注册时将数据保存到数据库中。我对如何在用户登录后检索有关用户的数据感到有些困惑。

在我的帐户控制器中,我有一个登录操作,当用户登录时会发布到该操作。这是我的代码:

[HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
            var userName = WebSecurity.CurrentUserName;
            var identityName = User.Identity.Name;
            var currentuserid = WebSecurity.GetUserId(model.UserName);
            var context = new UsersContext();
            var user = context.UserProfiles.SingleOrDefault(u => u.UserId == currentuserid);
            var accountTypeId = user.AccountTypeId;

            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }

WebSecurity.CurrentUserName 和 User.Identity.Name 都是空字符串,但是,我可以使用 WebSecurity.GetUserId(model.UserName) 检索 UserId,因此可以检索用户数据,我可以获得 accountTypeId。

奇怪的是,当用户被重定向到登录页面后,从 .cshtml 页面调用 User.Identity.Name 时,它​​会显示在我的页面上。因此,在我的控制器的登录操作和目标页面之间的某个位置,User.Identity 正在设置数据。

我假设由于我通过了 WebSecurity.Login 检查,WebSecurity 将拥有有关登录用户的信息,但似乎并非如此。

我错过了什么?

4

1 回答 1

9

用户名被写入 cookie。为了使 cookie 数据可用,必须将其放入响应中并发送回浏览器。在下一次请求时,cookie 值将被读取并用于填充User.Identity.Name属性。

换句话说,在您调用 Redirect 之前,该User.Identity.Name属性应该是一个空字符串。这就是登录后重定向的目的:将cookie写入浏览器,以便后续请求将用户视为已登录。

于 2012-09-29T15:17:55.803 回答