В добавленной вами ссылке вы видите, что access_token на самом деле не изменен.То, что происходит, - то, что требования от access_token сопоставлены с User.Identity.И в OnTokenValidated
к этому User.Identity добавляются дополнительные утверждения.
Проблема в том, что tenantid не подходит в качестве утверждения, поскольку IdentityClaims должен моделировать Identity, которая не зависит от контекста, а что-топоскольку tenantid's зависит от контекста.
Для ресурса, который вы не можете использовать OnTokenValidated
.Вместо этого используйте промежуточное программное обеспечение.Я предлагаю вам взглянуть на решение команды IdentityServer: PolicyServer .
Короче говоря, после аутентификации (IdentityServer) policyserver добавляет претензии к User.Identity на основе настроенногоавторизация.
В API есть две части (= ресурс):
- Расширение User.Identity с заявками на авторизацию
- Политики, так как здесь логикадолжно произойти.
И тогда у вас будет то, что вы хотите.Ресурсная авторизация.
PolicyServer использует файл настроек json, но вы можете расширить его с помощью своего собственного хранилища.В примере отсутствуют обычные утверждения, но вы можете расширить модель Политики утверждениями:
// Just the lines to include claims.
public class Policy
{
public List<Claim> Claims { get; internal set; } = new List<Claim>();
internal Task<PolicyResult> EvaluateAsync(ClaimsPrincipal user)
{
var claims = Claims.Select(x => new Claim { Name = x.Name, Value = x.Value }).ToArray();
var result = new PolicyResult()
{
Claims = claims
};
}
}
и в конфигурации:
"Policy": {
"claims": [
{
"name": "tenantid",
"value": "44"
}
],
"roles": [
В промежуточном программном обеспечении добавить утверждения для Пользователя.Идентификационные данные, например:
id.AddClaims(claims);