.net-core - 如何仅在 id_token 但不在 access_token IdentityServer4 中包含声明
问题描述
我正在使用 Identity Server 4 和隐式授权类型。我有一个 SPA,它使用 response_type: 'id_token token' 向 IS4 发出授权请求。
我有一个使用 GetProfileDataAsync 方法的 IProfileService 的简单实现:
public virtual Task GetProfileDataAsync(ProfileDataRequestContext context)
{
context.AddRequestedClaims(context.Subject.Claims);
context.IssuedClaims.Add(new Claim("custom1", "custom1"));
context.IssuedClaims.Add(new Claim("custom2", "custom2"));
return Task.CompletedTask;
}
它工作正常;我收到一个 access_token 和一个 id_token。但它们都包含我的自定义声明。
如何在 access_token 中仅包含“custom1”声明,但在 id_token 中包含“custom1”和“custom2”声明?
解决方案
Profile Service 在不同的上下文中被多次调用:
- 对于访问令牌:
Context.Caller = ClaimsProviderAccessToken
- 对于身份令牌:
Context.Caller = UserInfoEndpoint
对于特定于上下文的声明,您应该检查上下文调用者:
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
context.AddRequestedClaims(context.Subject.Claims);
context.IssuedClaims.Add(new Claim("custom1", "custom1"));
// Add access token claims
if (Context.Caller == "ClaimsProviderAccessToken")
{
}
// Add identity token claims
if (Context.Caller == "UserInfoEndpoint")
{
context.IssuedClaims.Add(new Claim("custom2", "custom2"));
}
return Task.CompletedTask;
}
推荐阅读
- ruby - 为什么 google.co.jp 会以 400 Bad Request 响应?
- ios - 关于在 Swift 中重复加载 collectionView 单元格的问题
- postgis - PostGIS 中的 ST_CONTAINS 和 ST_WITHIN 问题
- autohotkey - 从文件中查找数据,并将它们存储为变量
- json - jq - 选择包含特定键的对象
- clojure - 使用 Clojure 的 Ring 提供静态资源
- python - 如何自动弹出窗口?
- html - React - 即使没有事件发生,网站空闲时 CPU 使用率也很高
- ssl - RabbitMq TLS/SSL 连接错误,类型与表约束不兼容
- java - 为什么我可以从 getClass().getResource() 获取有效的 url,但是返回的 url 会创建一个不存在的文件