【问题标题】:Identity Server - Add custom parameters to the JSON response from the Token Endpoint身份服务器 - 将自定义参数添加到来自令牌端点的 JSON 响应
【发布时间】:2019-06-16 03:52:38
【问题描述】:

我需要在身份服务器令牌端点的令牌响应中添加自定义成员。

预期响应示例:

{
"access_token": "XXXXXXXXXXXXXXX",
"token_type": "bearer",
"expires_in": 3600,
"scope": "patient/Observation.read patient/Patient.read",
"patient": 123,
"refresh_token":"XXXXXXXXXXXXXXXXX"
}

我想在响应中添加范围、患者参数,即使它存在于访问令牌中。

任何有关这方面的指导都会非常有帮助!

【问题讨论】:

    标签: identityserver4 identityserver3


    【解决方案1】:

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

    话虽如此,IdentityServer4 具有极强的可扩展性,因此您可以在技术上创建自己的ITokenResponseGenerator 实现和您自己的TokenResponse 自定义模型以实现此行为。

    但不建议这样做,因为您似乎正在尝试解决其他一些系统无法处理非常标准的 JWT 的缺点。

    【讨论】:

    • 感谢您的更新。我能够实现接口 ICustomTokenGenerator 以向身份服务器 3 的令牌响应添加额外的参数。您的回复对使其正常工作非常有帮助。我已经在这篇文章中添加了答案。
    【解决方案2】:

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

    步骤:

    1. 实现接口

    2. 在工厂注册接口

    此修复对我有用,我能够在令牌响应中获取自定义项。

    //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);
                }
            }
    

    Step2:在 Identity Server 工厂中注册 CustomTokenResponseGenerator

    //Token Service
                factory.CustomTokenResponseGenerator = new Registration<ICustomTokenResponseGenerator, CustomTokenResponseGeneratorService>();
    

    参考:Interface Detail for Identity Server 3

    【讨论】:

      【解决方案3】:

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

      public class CustomTokenRequestValidator : ICustomTokenRequestValidator
      {
          public Task ValidateAsync(CustomTokenRequestValidationContext context)
          {
              context.Result.CustomResponse =
                new Dictionary<string, object> {{ "patient", "alice"}};
              return Task.CompletedTask;
          }
      
          public CustomTokenRequestValidator()
          {
              
          }
      }
      

      另外不要忘记在启动时在 configureServices 方法中注册依赖。您可以在添加 IdentityServer 服务后附加 .AddCustomTokenRequestValidator({pass-in-name-of-class-implementing})。

      【讨论】:

        猜你喜欢
        • 2015-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多