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
是我的服务器。
在服务器上,我创建了几个端点,并且必须授权用户访问这些端点。而且效果很好。
我收到来自Auth0
的access_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 => 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 中的单点注销