【问题标题】:Authorize Roles Controller Attribute not working in ASP Core 2.2授权角色控制器属性在 ASP Core 2.2 中不起作用
【发布时间】:2020-02-21 13:35:18
【问题描述】:

当放置在控制器顶部时,Authorize Attribute 在 ASP Core 2.2 中不起作用。我的 startup.cs 是这样配置的。

        //Add Claims
        services.AddScoped<IUserClaimsPrincipalFactory<User>, UserClaimsPrincipalFactory<User, Role>();

        //Add Context
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddHttpContextAccessor();
        services.AddDbContext<DbContext>();
        services.AddIdentity<User, Role>(
            config =>
            {
                config.SignIn.RequireConfirmedEmail = true;
                config.User.RequireUniqueEmail = true;
            }
            )
            .AddRoles<Role>()
            .AddRoleManager<RoleManager<Role>>()
            .AddDefaultUI(UIFramework.Bootstrap3)
            .AddDefaultTokenProviders()
            .AddClaimsPrincipalFactory<MyUserClaimsPrincipalFactory>()
            .AddEntityFrameworkStores<DbContext>();


        //Add MVC
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddAuthorization();
        services.AddAuthentication();

UserClaimsPrincipalFactory 可以正常工作,我可以通过 UserManager 访问视图中的声明,并根据声明中的角色过滤链接。

但是当我在控制器上这样做时。

    [Authorize(Roles = "Administrator")]
    [HttpGet]
    public async Task<IActionResult> Index()
    {
      return View();
    }

它不起作用,尽管在身份中具有所需的角色,但我的访问被拒绝。这是一个已知的错误吗?是否有人设法让角色属性在 ASP Core 2.2 中工作?

【问题讨论】:

  • 您添加服务的顺序很重要
  • 仍然被拒绝访问。授权工作正常,但一旦添加管理员角色,我就会收到拒绝访问错误。
  • 管理员是否在数据库中分配了该角色?
  • 是的。我通过 userclaims 获得角色,用于通过 User 过滤链接。角色 = “管理员”不起作用。在控制器中调试用户显示他在登录后没有声明,但在登录期间 MyUserClaimsPrincipalFactory 运行良好并且声明存在。返回的身份范围不应该在启动后分配和持久化吗?
  • 检查数据库。声明在 .net 核心中的工作方式不同

标签: asp.net asp.net-core


【解决方案1】:
    //Add Claims
    services.AddScoped<IUserClaimsPrincipalFactory<User>, 
    UserClaimsPrincipalFactory<User, Role>();

    //these should be move AddMvc
    services.AddAuthorization();
    services.AddAuthentication();

    //Add Context
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddHttpContextAccessor();
    services.AddDbContext<DbContext>();
    services.AddIdentity<User, Role>(
        config =>
        {
            config.SignIn.RequireConfirmedEmail = true;
            config.User.RequireUniqueEmail = true;
        }
        )
        .AddRoles<Role>()
        .AddRoleManager<RoleManager<Role>>()
        .AddDefaultUI(UIFramework.Bootstrap3)
        .AddDefaultTokenProviders()
        .AddClaimsPrincipalFactory<MyUserClaimsPrincipalFactory>()
        .AddEntityFrameworkStores<DbContext>();


    //Add MVC
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

【讨论】:

  • 仍然被拒绝访问 我尝试了各种安排。授权工作正常,但一旦我添加角色 =“管理员”,我就会被拒绝访问。
【解决方案2】:

我根据在 ASP Core 2.2 中工作的声明获得了角色。没有声明的角色不起作用(这可以在 ASP Core 3.0 中修复)。

在创建角色(角色表)并将用户添加到这些角色(用户角色表)之后,您需要向 RoleClaim 和 UserClaim 表添加值。

编辑...

基本上将用户添加到角色并使用 IUserClaimsPrincipalFactory 中的 claimtypes.role 来返回角色或使用 usermanager 和 rolemanager 手动添加 userclaim 角色。

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 2020-04-28
    • 2019-07-31
    • 2015-01-06
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2015-07-17
    • 2017-09-16
    相关资源
    最近更新 更多