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,我找到了解决方案。

  1. 创建需求和授权需求处理程序:

     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;
         }
     }
    
  2. 为服务的授权要求处理程序添加新的授权策略和依赖单例(在 Program.cs 中):

    builder.Services.AddAuthorization(选项=> { options.AddPolicy("MyPolicy", policy => policy.Requirements.Add(new ClaimsScopeOrRoleRequirement());

    });

    builder.Services.AddSingleton();

  3. 用添加策略Authorize的属性装饰控制器

    [授权(“MyPolicy”)] public class 我的控制器:ControllerBase { }

所以它有效。

(抱歉,代码格式不适用于此 post 中的所有代码部分 ...)