asp.net-core - 如何仅在扩展授权类型中添加自定义声明
问题描述
我想在我的扩展授权类型中添加自定义声明。并且我的代码在实现 IExtensionGrantValidator 的类中类似于以下代码,但由此产生的令牌不包含添加的 custome_claim
public async Task ValidateAsync(ExtensionGrantValidationContext context)
{
var userToken = context.Request.Raw.Get("token");
if (string.IsNullOrEmpty(userToken))
{
context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant);
return;
}
var result = await _validator.ValidateAccessTokenAsync(userToken);
if (result.IsError)
{
context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant);
return;
}
var sub = result.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;
context.Result = new GrantValidationResult(sub, "graph_delegation", new List<Claim> { new Claim("custome_claim", "Hello from the custom grant") });
}
解决方案
该过程由三个部分组成,并且对于发布具有自定义声明的任何访问令牌都是相同的,不仅对于扩展授权:
首先,客户必须使用适当的范围来请求索赔。在 Identity Server 端GetApiResources()
,方法必须将该声明类型添加到适当的范围内。
public static IEnumerable<ApiResource> GetApiResources(){
return new List<ApiResource>{
new ApiResource{
Name = "API 1",
DisplayName = "API 1",
Scopes = {
new Scope {
Name = "my-api",
UserClaims = {
JwtClaimTypes.SessionId,
JwtClaimTypes.Role,
Constants.TenantIdClaimType,
"custom_claim" }
}
}
}
};
}
其次,必须以某种方式发出声明——一种方法是使用GrantValidationResult
构造函数,如上面原始帖子中所述,将其放入。
最后,应将请求的声明添加到令牌的 IssuedClaims 集合中。这是ProfileService
实施的工作。ProfileService
应在 IdSrv 启动中实现和注册自定义,如下所示:
services.AddIdentityServer()
***
.AddInMemoryApiResources(GetApiResources())
.AddExtensionGrantValidator<DelegationGrantValidator>()
.AddProfileService<ExtendedProfileService>();
在哪里
public override Task GetProfileDataAsync(ProfileDataRequestContext context)
行:context.AddRequestedClaims(context.Subject.Claims);
将完成这项工作。不必IProfileService
从头开始实现,但足以派生现有的方法并仅覆盖一种方法。
推荐阅读
- git - 重复合并来自另一个分支的单个文件
- java - 在java中增加构造函数方法中的静态变量是否有效?
- python - 使用python将jpg转换为pdf时旋转无效
- flutter - ListView 相当于 Flutter 中 Column 的 mainAxisSize
- ios - 如何基于其他 .p12 证书创建 IPA
- python-3.x - 使用 Cloud Functions 将文件从 Google Cloud Storage 传输到 Windows VM 实例
- graph - 将 Graphviz 节点并排放置,不带箭头
- scala - 由 spark-shell (scala) 暂存的 SparkSession 变量是 val 还是 var?
- python - 熊猫:按一天中的时间对数据框进行分组并在一个图形上绘制图
- typescript - 结构类型解决方法不起作用