登录后,WebSecurity.CurrentUserName和User.Identity.Name为null

Tom*_*eck 8 security asp.net-mvc-4 simplemembership

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

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

[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);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

我假设自从我通过WebSecurity.Login检查后,WebSecurity将获得有关登录用户的信息,但似乎不是这样.

我错过了什么?

dan*_*wig 9

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

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