Identityserver4 Identity Server—将自定义参数添加到来自令牌端点的JSON响应中

Identityserver4 Identity Server—将自定义参数添加到来自令牌端点的JSON响应中,identityserver4,identityserver3,Identityserver4,Identityserver3,我需要在Identity Server令牌端点的令牌响应中添加自定义成员 预期答复样本: { “访问令牌”:“XXXXXXXXXXXXX”, “令牌类型”:“承载者”, “expires_in”:3600, “范围”:“患者/观察.阅读患者/患者.阅读”, “病人”:123, “刷新令牌”:“XXXXXXXXXXXXXXXXXX” } 我想在响应中添加scope,patient参数,即使它存在于访问令牌中 任何关于这方面的指导都会非常有用 由于TokenResponse的静态特性,无法使用开箱

我需要在Identity Server令牌端点的令牌响应中添加自定义成员

预期答复样本:

{
“访问令牌”:“XXXXXXXXXXXXX”,
“令牌类型”:“承载者”,
“expires_in”:3600,
“范围”:“患者/观察.阅读患者/患者.阅读”,
“病人”:123,
“刷新令牌”:“XXXXXXXXXXXXXXXXXX”
}
我想在响应中添加scope,patient参数,即使它存在于访问令牌中


任何关于这方面的指导都会非常有用

由于
TokenResponse
的静态特性,无法使用开箱即用配置

话虽如此,IdentityServer4的可扩展性非常强,因此您可以从技术上创建自己的
ITokenResponseGenerator
实现和自己的
TokenResponse
自定义模型,以实现这种行为


但是,我不建议这样做,因为您似乎试图解决其他系统无法处理标准JWT的缺点。

我通过实现ICustomTokenResponseGenerator接口并在该接口的自定义部分添加所需参数,使Identity Server 3能够提供自定义令牌响应令牌响应

步骤:

  • 实现接口

  • 在工厂注册接口

  • 这个修复程序对我有效,我能够在令牌响应中获得自定义项

    //Interface Implementation    
    public class CustomTokenResponseGeneratorService: ICustomTokenResponseGenerator
            {
                protected ITokenService _tokenService;
    
                public CustomTokenResponseGeneratorService(ITokenService tokenService)
                {
                    _tokenService = tokenService;
                }
    
                public Task<TokenResponse> GenerateAsync(ValidatedTokenRequest request, TokenResponse response)
                {
                    var patientID = 123;
    
                    response.Custom.Add("patient"               , patientID);
                    response.Custom.Add("scope"                 , request.AuthorizationCode.Scopes.ToArray());
                    response.Custom.Add("need_patient_banner"   , "false");
                    response.Custom.Add("encounter"             , patientID);
                    response.Custom.Add("client_id"             , request.AuthorizationCode.ClientId);
                    response.Custom.Add("smart_style_url"       , "UNK");
                    return Task.FromResult(response);
                }
            }
    
    //接口实现
    公共类CustomTokenResponseGeneratorService:ICustomTokenResponseGenerator
    {
    受保护的ITokenService\u令牌服务;
    公共CustomTokenResponseGeneratorService(ITokenService tokenService)
    {
    _令牌服务=令牌服务;
    }
    公共任务生成同步(ValidatedTokenRequest请求、TokenResponse响应)
    {
    var patientID=123;
    response.Custom.Add(“patient”,patientID);
    response.Custom.Add(“scope”,request.AuthorizationCode.Scopes.ToArray());
    响应。自定义。添加(“需要患者”横幅、“错误”);
    response.Custom.Add(“遭遇”,patientID);
    response.Custom.Add(“client_id”,request.AuthorizationCode.ClientId);
    response.Custom.Add(“smart_style_url”,“UNK”);
    返回Task.FromResult(响应);
    }
    }
    
    步骤2:在Identity Server工厂中注册CustomTokenResponseGenerator

    //Token Service
                factory.CustomTokenResponseGenerator = new Registration<ICustomTokenResponseGenerator, CustomTokenResponseGeneratorService>();
    
    //令牌服务
    factory.CustomTokenResponseGenerator=新注册();
    

    参考:

    对于Identity Server 4,您可以通过实现ICustomTokenRequestValidator接口在令牌响应中添加自定义参数

    公共类CustomTokenRequestValidator:ICustomTokenRequestValidator
    {
    公共任务ValidateAsync(CustomTokenRequestValidationContext上下文)
    {
    context.Result.CustomResponse=
    新词典{{“病人”、“爱丽丝”};
    返回Task.CompletedTask;
    }
    公共CustomTokenRequestValidator()
    {
    }
    }
    

    另外,不要忘记在启动时在configureServices方法中注册依赖项。添加IdentityServer服务后,您可以追加.AddCustomTokenRequestValidator({传入实现类的名称})。

    感谢您的更新。我能够实现接口ICustomTokenGenerator,向Identity Server 3的令牌响应添加额外的参数。你的回答真的很有帮助。我已经为这篇文章添加了答案。