Auth0 .NET Core - 从 access_token 读取权限

Posted

技术标签:

【中文标题】Auth0 .NET Core - 从 access_token 读取权限【英文标题】:Auth0 .NET Core - Reading permissions from access_token 【发布时间】:2020-11-16 23:44:58 【问题描述】:

我正在使用Auth0.NET Core Web Api 是我的服务器。

在服务器上,我创建了几个端点,并且必须授权用户访问这些端点。而且效果很好。

我收到来自Auth0access_token,我可以调用 web api 上的方法,这太完美了!

现在我想从我的access_token 中读取权限(在 .net 核心中),如果access_token 中有相应的权限,我应该访问该endpoint

当我使用https://jwt.io/ 解码令牌时,我可以看到令牌中有权限:

在 Endpoint 上方的控制器中,我做了下一步:

[HttpPost]
[Authorize("create:authors")]
public async Task<ActionResult> Post([FromBody] UserRequestDto request, CancellationToken cancellationToken)

    var result = await authorsServiceLayer.AddNewAuthor(request, cancellationToken);
    return Ok(result);

我从Auth0 删除了很多文档,但我仍然感到困惑,无论如何我将其添加到我的Startup.cs

services.AddAuthentication(options =>

    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    
).AddJwtBearer(options =>

    options.Authority = $"https://_config["Auth0Settings:Domain"]/";
    options.Audience = _config["Auth0Settings:Audience"];
);

services.AddAuthorization(options =>

    options.AddPolicy("create:authors", policy => policy.Requirements.Add(new HasScopeRequirement("create:authors", $"https://_config["Auth0Settings:Domain"]/")));
);

我不知道Startup.cs 中的这段代码在做什么。

无论如何,当我尝试与邮递员一起执行此操作(使用包含权限的 access_token)时,我得到的回应是:

403 禁止

所以不知不觉我已经设置了一些东西,但我不知道如果我在 access_token 中拥有该权限,为什么它会被禁止??

顺便说一句,我应该为我系统中的每个权限options.AddPolicy(.. 吗?

这听起来对我来说是个糟糕的解决方案:S

任何形式的帮助都会很棒!

干杯

【问题讨论】:

只需检查您的启动配置方法,您还有 app.UseAuthentication(); 您可以在 AddJwtBearer() 中添加 options.Events = new JwtBearerEvents(); options.Events.OnForbidden = n =&gt; return Task.CompletedTask; ; 并添加断点或日志以查看实际发生的情况。 【参考方案1】:

您需要使用 PermissionHandler 探索 Claims 您的所有代码都是正确的,但您需要添加

实现接口IAuthorizationRequirement

的类
public class HasPermissionRequirement : IAuthorizationRequirement

    public string Issuer  get; 
    public string Permission  get; 

    public HasPermissionRequirement(string permission, string issuer)
    
        Permission = permission ?? throw new ArgumentNullException(nameof(permission));
        Issuer = issuer ?? throw new ArgumentNullException(nameof(issuer));
    

然后添加你的 AuthorizationHandler

public class HasPermissionHandler : AuthorizationHandler<HasPermissionRequirement>

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasPermissionRequirement requirement)
    
        if (!context.User.HasClaim(c => c.Type == "permissions" && c.Issuer == requirement.Issuer))
            return Task.CompletedTask;

        var permissions = context.User.FindAll(c => c.Type == "permissions" && c.Issuer == requirement.Issuer);

        if(permissions.Any(s => s.Value == requirement.Permission))
            context.Succeed(requirement);

        return Task.CompletedTask;
    

最后在您的 Startup 类中的方法 ConfigureServices 中注入您的自定义处理程序

services.AddSingleton<IAuthorizationHandler, HasPermissionHandler>();

【讨论】:

以上是关于Auth0 .NET Core - 从 access_token 读取权限的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core 中的多个 JWT 授权机构/发行人

supertokens-core 开源项目功能对标Auth0

通过 Auth0 React 和 ASP.net 核心授权然后使用 JWT 令牌

ASP.NET Core OpenID Connect 中的单点注销

JWT 身份验证 ASP.NET Core MVC 应用程序

ASP.NET Core - AddJwtBearer - 授权 URL,它是如何工作的?