如何在 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_codeclient_credentials 流使用,但这很简单:第二个任务不包含用户信息(subsid 索赔)。
也不要忘记 Identityserver 中的受限身份验证流程组合(例如,您不能允许同一客户端同时使用 implicitauthorization_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() 之后