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