【问题标题】:Authorize attribute always denied even if in correct group即使在正确的组中,授权属性也总是被拒绝
【发布时间】:2020-11-03 01:04:34
【问题描述】:

我遇到了授权属性问题,即使我为管理员和经理设置了角色,它也总是被拒绝。这是 stadnard login identiy 页面的代码我有一种感觉我错过了一些东西,当用户登录时他们应该被添加到角色中?我正在使用 .net core 3.1 和 ef core

我觉得我需要使用或找到用户所属的角色并将其分配给它的东西?

 await userStore.AddToRoleAsync(user, "admin");

在下面的某个地方

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
           
        if (result.Succeeded)
        {
            var user = await _userManager.FindByEmailAsync(Input.Email);
            string Intitals = user.FirstName.Substring(0, 1) + user.LastName.Substring(0, 1);
            _contextAccessor.HttpContext.Session.SetString("Intitals", Intitals);

            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

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

编辑 2

我什至尝试将其添加到启动中,但当我将用户放在正确的组中时,我仍然无法访问。

services.AddAuthorization(options =>
 options.AddPolicy("MISSystem",
 policy => policy.RequireClaim("manager", "admin", "agent")));

编辑 3 下面的人没有为我解决它,所以我在这里创建了一个可复制的版本。

https://github.com/davidbuckleyni/AuthorisationRepoMS

在我忘记包含我的声明工厂代码之前,我将在下面包含。

using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using MISSystem.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;

namespace MISSystem.Web.Helpers {
    public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser> {
        public MyUserClaimsPrincipalFactory(
            UserManager<ApplicationUser> userManager,
            IOptions<IdentityOptions> optionsAccessor)
                : base(userManager, optionsAccessor) {
        }

        protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user) {
            var identity = await base.GenerateClaimsAsync(user);
            identity.AddClaim(new Claim("FullName", user.FirstName + " " + user.LastName ?? "[Click to edit profile]"));
            return identity;
        }
    }
}

【问题讨论】:

    标签: c# asp.net-core asp.net-identity ef-core-3.1


    【解决方案1】:

    我终于在另一个例子中找到了原因,他们使用自定义声明工厂我的代码实际上并不需要,所以一旦我删除了这一行。

    .AddClaimsPrincipalFactory();

    经理属性按预期工作

    【讨论】:

      【解决方案2】:

      这是 stadnard login identiy 页面的代码我觉得我错过了一些东西,当用户登录时他们应该被添加到角色中?

      您可以使用UserManager.AddToRoleAsync(TUser, String) method 将特定用户添加到角色,如下所示。

      var user = await _userManager.FindByNameAsync("test@example.com");
      
      await _userManager.AddToRoleAsync(user, "admin");
      

      您可以检查数据库AspNetUserRoles表中是否确实添加了预期记录(UserId-RoleId)

      此外,请确保您已使用RoleManager.CreateAsync(TRole) method 创建admin 角色。

      【讨论】:

      • 嗨 Feri 我明白这一点,但是如何找出用户所属的角色。我已经在我的管理屏幕中将它们放在角色表中
      • how does one find out what role the user belongs to 可以使用UserManager&lt;TUser&gt;.GetRolesAsync(TUser) method 获取指定用户所属的角色名称。
      • 用户已经担任该角色,我的意思是您不需要设置 cookie,以便授权注释与其中的用户角色正确工作。
      • 请看我上面的编辑用户是正确的角色
      猜你喜欢
      • 1970-01-01
      • 2021-10-31
      • 2012-12-03
      • 2021-10-10
      • 2020-04-12
      • 2019-03-20
      • 2019-07-29
      • 1970-01-01
      • 2022-01-01
      相关资源
      最近更新 更多