如何在 IdentityServer4 中将授权类型添加到访问令牌中?
How to add grant type into access token in IdentityServer4?
我需要知道受 IdentitySrever4 保护的 API 中客户端的授权类型(或 OAuth 流程类型),但不确定如何操作。我假设我需要将授权类型添加到访问令牌。有人可以通过指向 instructions/documentations 或示例代码来帮助我吗?
更新
在标准 IdentityServer4 EF 模型下,我的 SQL 服务器数据存储有一个 ClientGrantTypes table 和一个 ClientClaims table(见下面的屏幕截图)。我假设我需要创建一个与 ClientGrantTypes 关联的 ClientClaims 记录。如果是SQL,直接加入ClientID上的table就可以了,但是这里怎么实现才能让Grant Type变成access token呢?
一种选择是为不同的流定义不同的客户端,然后使用 ClientClaim 来指示它是什么类型的客户端:
要在客户端定义中设置客户端声明,只需将其设置为:
ClientClaimsPrefix="",
AlwaysSendClientClaims=true,
Claims = new List<ClientClaim>()
{
new ClientClaim("role","admin"),
new ClientClaim("name","joe"),
new ClientClaim("admin","yes"),
new ClientClaim("employmentid","employee"),
new ClientClaim("employeetype","yes"),
new ClientClaim("creditlimit","100000")
}
如果您解释了需求的目的,将更容易找到答案。
根据我的经验,一项常见任务是区分同一客户端的 authorization_code
和 client_credentials
流使用,但这很简单:第二个任务不包含用户信息(sub
和 sid
索赔)。
也不要忘记 Identityserver 中的受限身份验证流程组合(例如,您不能允许同一客户端同时使用 implicit
和 authorization_code
流程),因此通常会绑定一个客户端到唯一的用户交互流程。
最后,auth流程一般不关API。这只是关于 IdP 和客户端之间的交互。 API 通常使用范围作为有关客户的一般信息,所以...当您有两个客户时 - 一个具有 implicit
授权,另一个具有 authorization_code
,您可以区分哪个在通过设置不同的范围来使用。
这还不够吗?
A check for a particular grant type 可以通过以下方式在 Identityserver 中执行:
public class ExtendedClaimsService : DefaultClaimsService{
public override async Task<IEnumerable<Claim>> GetAccessTokenClaimsAsync(
ClaimsPrincipal subject,
ResourceValidationResult resourceResult,
ValidatedRequest request)
{
var outputClaims = (await base.GetAccessTokenClaimsAsync(subject, resourceResult, request)).ToList();
//if (request.Secret.Type == "NoSecret") //this is more or less the same
if ((request as ValidatedTokenRequest)?.GrantType != "client_credentials")
{
//filter out server-side-only scopes here
//or add any custom claim you like
}
return outputClaims;
}
}
注册:services.AddTransient<IClaimsService, ExtendedClaimsService>();
在 Startup
services.AddIdentityServer()
之后
我需要知道受 IdentitySrever4 保护的 API 中客户端的授权类型(或 OAuth 流程类型),但不确定如何操作。我假设我需要将授权类型添加到访问令牌。有人可以通过指向 instructions/documentations 或示例代码来帮助我吗?
更新
在标准 IdentityServer4 EF 模型下,我的 SQL 服务器数据存储有一个 ClientGrantTypes table 和一个 ClientClaims table(见下面的屏幕截图)。我假设我需要创建一个与 ClientGrantTypes 关联的 ClientClaims 记录。如果是SQL,直接加入ClientID上的table就可以了,但是这里怎么实现才能让Grant Type变成access token呢?
一种选择是为不同的流定义不同的客户端,然后使用 ClientClaim 来指示它是什么类型的客户端:
要在客户端定义中设置客户端声明,只需将其设置为:
ClientClaimsPrefix="",
AlwaysSendClientClaims=true,
Claims = new List<ClientClaim>()
{
new ClientClaim("role","admin"),
new ClientClaim("name","joe"),
new ClientClaim("admin","yes"),
new ClientClaim("employmentid","employee"),
new ClientClaim("employeetype","yes"),
new ClientClaim("creditlimit","100000")
}
如果您解释了需求的目的,将更容易找到答案。
根据我的经验,一项常见任务是区分同一客户端的 authorization_code
和 client_credentials
流使用,但这很简单:第二个任务不包含用户信息(sub
和 sid
索赔)。
也不要忘记 Identityserver 中的受限身份验证流程组合(例如,您不能允许同一客户端同时使用 implicit
和 authorization_code
流程),因此通常会绑定一个客户端到唯一的用户交互流程。
最后,auth流程一般不关API。这只是关于 IdP 和客户端之间的交互。 API 通常使用范围作为有关客户的一般信息,所以...当您有两个客户时 - 一个具有 implicit
授权,另一个具有 authorization_code
,您可以区分哪个在通过设置不同的范围来使用。
这还不够吗?
A check for a particular grant type 可以通过以下方式在 Identityserver 中执行:
public class ExtendedClaimsService : DefaultClaimsService{
public override async Task<IEnumerable<Claim>> GetAccessTokenClaimsAsync(
ClaimsPrincipal subject,
ResourceValidationResult resourceResult,
ValidatedRequest request)
{
var outputClaims = (await base.GetAccessTokenClaimsAsync(subject, resourceResult, request)).ToList();
//if (request.Secret.Type == "NoSecret") //this is more or less the same
if ((request as ValidatedTokenRequest)?.GrantType != "client_credentials")
{
//filter out server-side-only scopes here
//or add any custom claim you like
}
return outputClaims;
}
}
注册:services.AddTransient<IClaimsService, ExtendedClaimsService>();
在 Startup
services.AddIdentityServer()
之后