我想在我的扩展程序授予类型中添加自定义声明。 并且我的代码类似于我的类中实现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") });
}
答案 0 :(得分:1)
该过程由三个部分组成,并且对于颁发具有自定义声明的任何访问令牌都是相同的,不仅用于扩展许可:
首先索赔必须由客户使用适当的范围请求。在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
,但足以派生一个现有的方法而仅覆盖一个方法。