asp.net 核心 Web API:并发使用 Roles 和 RequiredScope
asp.net core Web API: use Roles and RequiredScope concurrent
我有一个带有 OAuth2 (Microsoft Identity) 的 WebAPI,我需要支持 'Client Credential Flow'(对于非交互式驱动的客户端,具有角色)以及 'Autentication Credential Flow'(对于人工交互客户端, 与范围).
如何使用 'MyRole' 或 'MyScope' 使其成为 运行?
...当控制器基本上看起来像这样时:
[Authorize(Roles = "MyRole")]
[RequiredScope("MyScope")]
public class MyController : ControllerBase
{
}
我使用 .NET 6
感谢 Rena,我找到了解决方案。
创建需求和授权需求处理程序:
public class ClaimsScopeOrRoleRequirement : IAuthorizationRequirement
{
}
public class ClaimsScopeOrRoleRequirementHandler : AuthorizationHandler<ClaimsScopeOrRoleRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ClaimsScopeOrRoleRequirement requirement)
{
var canPass = context.User.IsInRole("MyRole"))
|| context.User.HasClaim(y =>
(y.Type == ClaimConstants.Scope || y.Type == ClaimConstants.Scp)
&& y.Value == "MyScope"));
if (!canPass)
{
context.Fail(new AuthorizationFailureReason(this, $"User neither claims required scope nor role."));
}
else
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
}
为服务的授权要求处理程序添加新的授权策略和依赖单例(在 Program.cs 中):
builder.Services.AddAuthorization(选项=>
{
options.AddPolicy("MyPolicy", policy => policy.Requirements.Add(new ClaimsScopeOrRoleRequirement());
});
builder.Services.AddSingleton();
用添加策略Authorize
的属性装饰控制器
[授权(“MyPolicy”)]
public class 我的控制器:ControllerBase
{
}
所以它有效。
(抱歉,代码格式不适用于此 post 中的所有代码部分 ...)
我有一个带有 OAuth2 (Microsoft Identity) 的 WebAPI,我需要支持 'Client Credential Flow'(对于非交互式驱动的客户端,具有角色)以及 'Autentication Credential Flow'(对于人工交互客户端, 与范围).
如何使用 'MyRole' 或 'MyScope' 使其成为 运行? ...当控制器基本上看起来像这样时:
[Authorize(Roles = "MyRole")]
[RequiredScope("MyScope")]
public class MyController : ControllerBase
{
}
我使用 .NET 6
感谢 Rena,我找到了解决方案。
创建需求和授权需求处理程序:
public class ClaimsScopeOrRoleRequirement : IAuthorizationRequirement { } public class ClaimsScopeOrRoleRequirementHandler : AuthorizationHandler<ClaimsScopeOrRoleRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ClaimsScopeOrRoleRequirement requirement) { var canPass = context.User.IsInRole("MyRole")) || context.User.HasClaim(y => (y.Type == ClaimConstants.Scope || y.Type == ClaimConstants.Scp) && y.Value == "MyScope")); if (!canPass) { context.Fail(new AuthorizationFailureReason(this, $"User neither claims required scope nor role.")); } else { context.Succeed(requirement); } return Task.CompletedTask; } }
为服务的授权要求处理程序添加新的授权策略和依赖单例(在 Program.cs 中):
builder.Services.AddAuthorization(选项=> { options.AddPolicy("MyPolicy", policy => policy.Requirements.Add(new ClaimsScopeOrRoleRequirement());
});
builder.Services.AddSingleton
(); 用添加策略
Authorize
的属性装饰控制器[授权(“MyPolicy”)] public class 我的控制器:ControllerBase { }
所以它有效。
(抱歉,代码格式不适用于此 post 中的所有代码部分 ...)