如何使用 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);
所以我的问题是:
- 我尝试做的事情有意义吗?
- 如何将我授予描述符的权限添加到令牌,以便它可用于签入策略。
要实现您想要的效果,请在处理令牌请求时在身份验证票证中添加您需要的所有声明。为了区分应用程序和用户,您可以添加一个自定义声明,指示令牌代表应用程序还是用户。
有关如何添加声明的详细信息,请查看客户端凭据流程示例:https://github.com/openiddict/openiddict-samples/blob/dev/samples/ClientCredentialsFlow/AuthorizationServer/Controllers/AuthorizationController.cs
我在 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);
所以我的问题是:
- 我尝试做的事情有意义吗?
- 如何将我授予描述符的权限添加到令牌,以便它可用于签入策略。
要实现您想要的效果,请在处理令牌请求时在身份验证票证中添加您需要的所有声明。为了区分应用程序和用户,您可以添加一个自定义声明,指示令牌代表应用程序还是用户。
有关如何添加声明的详细信息,请查看客户端凭据流程示例:https://github.com/openiddict/openiddict-samples/blob/dev/samples/ClientCredentialsFlow/AuthorizationServer/Controllers/AuthorizationController.cs