好的,一个下午,我承认了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
答案 0 :(得分:1)
如您发现的帖子指出用户身份未在登录后立即设置,因此User.Identity.Name不包含用户名。请改用model.UserName。尝试更改此行:
if (!IsProfileComplete(WebSecurity.GetUserId(User.Identity.Name)))
对此:
if (!IsProfileComplete(WebSecurity.GetUserId(model.UserName)))