0

好的,一个下午的下水道,我承认了 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

即使用户完成了配置文件,它也会将他们重定向到配置文件完成,因为它正在尝试查找用户 ID -1 的配置文件

我缺少关于 http 帖子和登录上下文集的内容吗?我正在寻找的最终结果是确保用户在进入系统之前完成了个人资料页面。也许有更好的方法来做到这一点?

编辑 - - -

找到了这个链接,但如果有人可以为我想要的功能建议一个更好的模式,我仍然会很感激你的快速评论

MVC 4 SimpleMembership - 为什么登录后 WebSecurity.CurrentUserId -1

4

1 回答 1

1

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

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

对此:

if (!IsProfileComplete(WebSecurity.GetUserId(model.UserName)))
于 2013-09-03T19:56:54.463 回答