如何使用 opendidict 授权客户端凭证流和密码流?

How to authorize with client credential flow and password flow using opendidict?

我在 net core 3 上使用 opendiddict 并保护我的 API 我正在使用密码流并使用角色进行授权过程。现在我需要为相同的 API 添加客户端凭证流,我不知道该怎么做 it.Here 是我在 API:

中的方法
 [Authorize(Roles = "Rol_A,Rol_B", AuthenticationSchemes = "Bearer")]
 [HttpGet("message")]
 public async Task<IActionResult> GetMessage_A()
 {...}

 [Authorize(Roles = "Rol_C,Rol_B", AuthenticationSchemes = "Bearer")]
 [HttpGet("message")]
 public async Task<IActionResult> GetMessage_B()
 {...}

但是应用程序没有角色。我正在阅读有关使用范围保护 API 的内容,但我不明白如何将用户和应用程序与范围相关联。另一方面,我也尝试过,使用策略,但一次只能用一个方法装饰一个方法,所以如果我有多个角色组合,那就一团糟了。反正我有这个:

在startup.cs

        services.AddAuthorization(options =>
        {
            options.AddPolicy("Policy_A", policy =>
            {
                policy.RequireAssertion(context =>
                {
                    //how to evaluate if application has permission

                    if (context.User.HasClaim(x => x.Type == OpenIdConnectConstants.Claims.Role && (x.Value == "Rol_A" || x.Value == "Rol_B")))
                    {
                        return true;
                    }
                    return false;
                });
            });
         });

我使用以下代码创建我的应用程序:

  var descriptor = new OpenIddictApplicationDescriptor
  {
    ClientId = "console",
    ClientSecret = "388D45FA-B36B-4988-BA59-B187D329C207",
    DisplayName = "My client application",
    Permissions =
    {
      OpenIddictConstants.Permissions.Endpoints.Token,
      OpenIddictConstants.Permissions.GrantTypes.ClientCredentials,
      OpenIddictConstants.Permissions.Prefixes.Scope+"api1"
    }
  };

  await manager.CreateAsync(descriptor);

所以我的问题是:

  1. 我尝试做的事情有意义吗?
  2. 如何将我授予描述符的权限添加到令牌,以便它可用于签入策略。

要实现您想要的效果,请在处理令牌请求时在身份验证票证中添加您需要的所有声明。为了区分应用程序和用户,您可以添加一个自定义声明,指示令牌代表应用程序还是用户。

有关如何添加声明的详细信息,请查看客户端凭据流程示例:https://github.com/openiddict/openiddict-samples/blob/dev/samples/ClientCredentialsFlow/AuthorizationServer/Controllers/AuthorizationController.cs