使用 JWT Token-Asp.net Core Identity 通过 Web API 上的角色声明进行授权

Posted

技术标签:

【中文标题】使用 JWT Token-Asp.net Core Identity 通过 Web API 上的角色声明进行授权【英文标题】:Authorization by a Claim of a Role on Web API using JWT Token- Asp.net Core Identity 【发布时间】:2019-07-01 06:38:25 【问题描述】:

我这几天一直在学习 Asp.Net Identity,我熟悉用[Authorize(Roles = "Admin")][Authorize(Policy = "OnlyAdminAndModerators")] 来授权控制器

我正在使用 JWT 令牌,当通过“[Authorize(Roles = "Admin")]”进行授权时,我所要做的就是在我的令牌上设置一个角色类型,如下所示:

  
  "nameid": "a173e923-1808-4d7d-2b64-08d684882677",  
  "unique_name": "yuri",  
  "role": [  
    "Admin",  
    "Moderator"  
  ],  
  "nbf": 1549522727,  
  "exp": 1549609127,  
  "iat": 1549522727  
  

有了这个,我的控制器能够通过json 上的“角色”名称和“Admin”的值进行身份验证。

我听说可以在 Identity AspNetRole 表上创建一个角色,通过 AspNetRoleClaims 表将声明与该角色相关联,例如 Admin 会有“CanAdd”声明,然后在 Startup 类上,我可以创建一个策略,比如 options.AddPolicy("Add Role", policy => policy.RequireClaim("CanAdd", "AddClaim"));

最后我可以继续我的控制器,使用[Authorize(Policy = "Add Role")] 设置一个方法,控制器将授权任何具有管理员角色的用户,因为他将拥有 CanAdd 声明。

抱歉,我知道这是个大问题,但我真的很想完成这项工作。 提前致谢。

【问题讨论】:

这是否涵盖了您的问题? benfoster.io/blog/asp-net-identity-role-claims 嘿,谢谢你的链接,它给了我一些想法,但它并没有给我我想要的东西。我的问题是,由于我正在检查 JWT 令牌中的权限,因此该令牌需要对其声明。我想要的是令牌上只有角色,然后在控制器上的 [Authorize] 属性上,权限将由角色声明。但由于令牌仅在控制器上验证之前具有角色,因此系统需要以某种方式访问​​数据库并检查是否存在与该角色关联的所需声明。 对于我搜索的内容,我发现有人在 Asp.Core MVC 上执行此操作,但我没有找到使用 API 和令牌执行此操作的方法。 【参考方案1】:

根据令牌的内容检索其他声明的一种方法可以在读取令牌之后和授权步骤之前运行的消息处理程序中完成。对于 .NET Full 框架,我使用 OWin 来执行此操作。此块将额外的声明注入到声明原则中,然后可以在您定义的策略中使用。

这是我的启动文件:

ConfigureAuthorization -> 我的扩展方法来包装 tge BearerTokenAuthentication owin 块 IncludeAzureActiveDirectoryUserClaims -> 从 Azure APi 获取声明并添加它们...

using Owin;

[assembly: OwinStartup(typeof(Token.API.Startup))]

namespace Token.API

    public partial class Startup
    
        public void Configuration(IAppBuilder app)
        
            app.ConfigureAuthorization(ClaimsProviders
                    .InitializeAuthorizationProviders()
                    .IncludeAzureActiveDirectoryUserClaims()
            );
        
    

如果我为 .NET Core 做这件事,它看起来像这样: 承载认证:link

在startup.cs中:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    
        app.UseAuthentication();
        app.Use(async (context, next) =>
        
            //Retrieve claims from database based on roles in token.
            // Add to loaded identity    (= context.User)           

            await next.Invoke();
        );

【讨论】:

以上是关于使用 JWT Token-Asp.net Core Identity 通过 Web API 上的角色声明进行授权的主要内容,如果未能解决你的问题,请参考以下文章

使用外部 JWT 令牌 ASP.NET CORE

如何使用剃刀视图 ASP .Net Core 从 JWT 声明角色

Jwt 代码在 .NET Core 2 上不起作用

无法使用 ASP.NET Core 从 JWT 令牌获取声明

使用 .NET Core 的 Firebase 身份验证 (JWT)

如何使用 ASP.NET Core 中的声明检查 JWT 中的权限?