【问题标题】:user can not access to authorized controllers [duplicate]用户无法访问授权控制器[重复]
【发布时间】:2019-07-18 19:13:54
【问题描述】:

我创建了用户登录页面。当我单击提交按钮时,一切正常。 我的意思是当我单击提交按钮时,此方法成功:

  • 在数据库中成功找到用户的用户名和密码。
  • 重定向成功

但最终用户无法访问已定义的控制器。


这是我的身份 ApplicationUser 模型:

public class ApplicationUser : IdentityUser
{
    public string UserProfile { get; set; }
}

这是我使用 ApplicationUser 模型的登录视图模型:

public class LoginViewModel
{
    [Required(ErrorMessage = "AN ERROR")]
    public string UserName { get; set; }

    [Required(ErrorMessage = "AN ERROR")]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "AN ERROR")]
    public bool RememberMe { get; set; }
}

这是我对用户登录的看法:

@model WOWapplication.Models.ViewModels.LoginViewModel
@{
    ViewData["Title"] = "Login";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@addTagHelper * , Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper * , WarOfWords


        <form asp-controller="Account" asp-action="Login" method="post" asp-route-returnUrl="@ViewData["ReturnUrl"]">
            <input asp-for="UserName" type="text"/>
            <span asp-validation-for="UserName"></span>
            <input asp-for="Password" type="password"/>
            <span asp-validation-for="Password"></span>
            <div>
                <input asp-for="RememberMe" type="checkbox" />
                <label asp-for="RememberMe"></label>
            </div>
            <div>
                <button type="submit">ورود</button>
                <button asp-controller="Register" asp-action="Register">Login</button>
            </div>
        </form>

最后这是处理上述代码的控制器:

namespace WOWapplication.Controllers
{
    public class AccountController : Controller
    {
        private readonly SignInManager<ApplicationUser> _SignInManager;
        public AccountController(SignInManager<ApplicationUser> signInManager)
        {
            _SignInManager = signInManager;
        }


        [HttpGet]
        public IActionResult Login(string returnUrl = null)
        {
            ViewData["ReturnUrl"] = returnUrl;
            return View();
        }


        [HttpPost] 
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
        {
            ViewData["ReturnUrl"] = returnUrl;
            if (ModelState.IsValid)
            {
                var result = await _SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, lockoutOnFailure: false);
                if (result.Succeeded)
                {
                    return RedirectTolLocal(returnUrl);
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "Wrong User name or password");
                    return View(model);
                }
            }
            return View(model);
        }

        private IActionResult RedirectTolLocal(string returnUrl)
        {
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction(nameof(HomeController.Index), "Home");
            }
        }
    }
}

此外,我将[Authorize(Roles = "Admin")] 用于我希望管理员访问该控制器的操作。

请帮我找出我项目中的错误。因为这个问题没有错误,一切都做对了,但最后登录无法成功完成,管理员用户没有权限。请记住,控制器中的一切都是成功的。谢谢大家。

【问题讨论】:

  • 您确定在AspNetUserRoles 中插入了用户角色吗?

标签: asp.net asp.net-core asp.net-identity


【解决方案1】:

我认为您的代码是正确的。关注底部:

  • 检查AspNetRoles,确保表中有Rolse
  • 并检查 AspNetUserRoles 并确保正确插入了用户角色

如果 Roles 和 UserRoles 插入正确,则通过以下代码在 Login 操作中获取用户角色:

var userRole = await _userManager.GetRolesAsync(user).Result.ToArray();

var roles = await _userManager.GetRolesAsync(user);

我把完整的登录代码放在这里:

    [HttpPost]
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        if (ModelState.IsValid)
        {
            var result = await _signInManager.PasswordSignInAsync(model.UserName,
                model.Password, model.RememberMe, lockoutOnFailure: false);

            if (result.Succeeded)
            {
                //Success Login
                var user = await _userManager.FindByNameAsync(model.UserName);
                var userRole = _userManager.GetRolesAsync(user);

           }
   }

【讨论】:

    【解决方案2】:

    我的问题通过将app.UseAuthentication(); 放入startup.cs 中的Configure() 方法解决了

    【讨论】:

      猜你喜欢
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2017-07-07
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多