2

我正在使用 Visual Studio 2015 中的默认站点模板。我添加了一些角色并为用户分配了角色。使用过的人登录时,角色为零。我需要做什么才能让角色发挥作用?

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
        {
            if (ModelState.IsValid)
            {
                var signInStatus = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);

                switch (signInStatus)
                {
                    case SignInStatus.Success:

                        var user = await GetCurrentUserAsync();


                        return RedirectToLocal(returnUrl);
                    case SignInStatus.Failure:
                    default:
                        ModelState.AddModelError("", "Invalid username or password.");
                        return View(model);
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }
4

2 回答 2

1

查看您的代码,您似乎缺少对角色的任何检查。

我遇到了类似的问题,在深入研究代码后,我注意到它GetCurrentUserAsync()没有返回有效的用户对象并且完好无损地返回了一个空对象。Context.User.GetUserId()是问题所在,并且没有返回要传递给 UserManager 的用户 ID。

在解决此问题之前,我正在使用以下内容:

if (result.Succeeded)
{
    var user = await UserManager.FindByEmailAsync(model.Email);
    if (await UserManager.IsInRoleAsync(user, Roles.Admin))
    {
        return RedirectToAction("Index", "Admin");
    }

    return RedirectToLocal(returnUrl);
}

虽然这并不理想,但它确实有效

于 2015-06-01T05:27:42.673 回答
0

这对我有用...对于无效的用户名或密码 4 我还没有重定向正确...将检查...

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
    {
        ViewBag.ReturnUrl = returnUrl;
        if (ModelState.IsValid)
        {
            var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);
            if (result.Succeeded)
            {
                return RedirectToLocal(returnUrl);
            }
            if (result.RequiresTwoFactor)
            {
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            }
            if (result.IsLockedOut)
            {
                return View("Lockout");
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
                return View(model);
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

这适用于 MVC 6,(VS 2015 RC)...你可以在这里找到它:https ://github.com/aspnet/Identity/tree/dev/samples/IdentitySample.Mvc

于 2015-06-18T05:51:32.253 回答