我想问一下,为什么UserId在用户登录后为空(在下面的代码中)。
OR
我需要根据用户的角色重定向用户。我需要尽可能简单。
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
string UserId = User.Identity.GetUserId(); <------ HERE
HelpRoles hr = new HelpRoles();
returnUrl = hr.CheckUserRoleAndRedirect(UserId);
return RedirectToLocal(returnUrl);
答案 0 :(得分:4)
在对请求进行身份验证后,将根据解密的cookie设置User对象,并且在下一个请求之前不会设置这些cookie,因此在User.Identity不为null之前需要刷新页面。
有关详细信息,请see this post。
要解决此问题,在成功案例中,您可以使用电子邮件地址从数据库中获取用户,并使用相应的ID。
答案 1 :(得分:1)
就像约翰·麦克说要解决这个问题一样,你必须在成功案例中获得用户。所以在获得UserId
var user = userManager.Find(model.UserName, model.Password);
或
var user = userManager.FindByEmail(model.Email);
或
var user = userManager.FindByName(model.Username);
修改强>
在这种情况下,您不必使用如下所示的方法
string UserId = User.Identity.GetUserId();
&lt; ------ HERE
因为一旦获得user object
,就可以获得user.Id