身份服务器 - 将自定义参数添加到来自令牌端点的 JSON 响应

Posted

技术标签:

【中文标题】身份服务器 - 将自定义参数添加到来自令牌端点的 JSON 响应【英文标题】:Identity Server - Add custom parameters to the JSON response from the Token Endpoint 【发布时间】: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"

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

通过实现 ICustomTokenResponseGenerator 接口并在 tokenResponse 的自定义部分中添加所需参数,我能够让 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);
            
        

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)。

【讨论】:

以上是关于身份服务器 - 将自定义参数添加到来自令牌端点的 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

密码更改需要来自 RESTful 令牌服务的响应

如何将自定义 HTTP 请求标头添加到 Thymeleaf 生成的表单或链接?

来自 C# HttpClient 针对 Spring 服务器 JWT 令牌的身份验证

如何将自定义数据添加到 Laravel Passport API 令牌?

令牌服务器上自定义端点的 Identity Server 4 客户端凭据

使用 keycloak 将自定义键/值添加到 JWT 令牌有效负载或用户