Процесс состоит из трех частей и идентичен для выдачи любого токена доступа с настраиваемыми утверждениями, а не только для предоставления расширения:
Во-первых требование должно быть запрошено клиентом, используя соответствующую область.На стороне 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
с нуля, но достаточно, чтобы извлечь существующий и переопределить только один метод.