通过使用JWT令牌在Web API上声明角色授权-Asp.net核心标识

yur*_*bsl 6 c# jwt asp.net-identity asp.net-core

过去几天我一直在学习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  
}  
Run Code Online (Sandbox Code Playgroud)

这样,我的控制器就可以通过上的“角色”名称json和“ Admin ” 的值进行身份验证。

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

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

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

Sch*_*478 3

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

这是我的启动文件:

配置授权 -> 我的扩展方法来包装 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()
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我为 .NET Core 执行此操作,它将看起来像这样: Bearer Authentication: 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();
        });
Run Code Online (Sandbox Code Playgroud)