身份服务器 - 将自定义参数添加到来自令牌端点的 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 响应的主要内容,如果未能解决你的问题,请参考以下文章
如何将自定义 HTTP 请求标头添加到 Thymeleaf 生成的表单或链接?
来自 C# HttpClient 针对 Spring 服务器 JWT 令牌的身份验证
如何将自定义数据添加到 Laravel Passport API 令牌?