MVC4 WebSecurity.Login第一次失败,无法获取User in Login方法

时间:2013-08-31 22:43:49

标签: c# security asp.net-mvc-4 login simplemembership

好的,一个下午,我承认了SO的帮助。我的登录方法很标准。如下所示,我正在使用WebSecurity.Login。

在此之后,我想检查用户的个人资料是否已完成,如果不是,请将其发送到该视图。

控制器

[AllowAnonymous]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid && WebSecurity.Login(model.Email, model.Password, persistCookie: model.RememberMe))
    {

        if (!User.IsInRole("User"))
        {
            if (!IsProfileComplete(WebSecurity.GetUserId(User.Identity.Name)))
            {
                return RedirectToAction("ProfileCompletion");
            }

            if(!User.IsInRole("User")) Roles.AddUserToRole(User.Identity.Name, "Vendor");
        }
        else // user has role
        {
            return RedirectToAction("Index", "Dashboard");
        }
    }

    ModelState.AddModelError("", "Unknown username or password.");
    return View(model);
}

我已经介入了一堆....在WebSecurity.Login之后我的印象是WebSecurity用户数据将被设置但是WebSecurity.GetUserId(User.Identity.Name)返回为-1

即使用户已完成配置文件,它也会将其重定向到配置文件完成,因为它正在尝试查找用户标识-1的配置文件

我是否遗漏了一些关于http帖子和登录上下文集的内容?我要找的最终结果是确保用户在进入系统之前完成了配置文件页面。也许有更好的方法来做到这一点?

编辑-----

找到了这个链接,但如果有人可以为我想要的功能提出更好的模式,我仍然会欣赏一个快速评论

MVC 4 SimpleMembership - Why WebSecurity.CurrentUserId -1 after login

1 个答案:

答案 0 :(得分:1)

如您发现的帖子指出用户身份未在登录后立即设置,因此User.Identity.Name不包含用户名。请改用model.UserName。尝试更改此行:

if (!IsProfileComplete(WebSecurity.GetUserId(User.Identity.Name)))

对此:

if (!IsProfileComplete(WebSecurity.GetUserId(model.UserName)))