Я решил это.
На уровне защиты API в классе запуска я имею следующую конфигурацию:
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "https://shared-domain-for-every-tenant/";
options.RequireHttpsMetadata = true;
options.ApiName = "atb_api";
});
Магия происходит на уровне IDP (IdentityServer4), при настройке IdentityServer я добавляю параметр «ЭмитентУри» следующим образом:
services.AddIdentityServer(options => {
options.IssuerUri = "https://shared-domain-for-every-tenant/";
})..AddDeveloperSigningCredential() ...other configurations ...
Когда я перехожу к https://auth.company1.com/.well-known/openid-configuration, возвращаемый документ выглядит так:
{
"issuer": "https://shared-domain-for-every-tenant/",
"jwks_uri": "https://auth.company1.com/.well-known/openid-configuration/jwks",
"authorization_endpoint": "https://auth.company1.com/connect/authorize",
"token_endpoint": "https://auth.company1.com/connect/token",
"userinfo_endpoint": "https://auth.company1.com/connect/userinfo",
...
}
Обратите внимание, что issure является статическим URL-адресом, тогда как все остальные конечные точки относятся к арендатору, который сделал запрос. Это позволяет API проверять токен доступа, а также иметь разные конечные точки для каждого арендатора (мне нужно это, чтобы показать другой экран входа для каждого из них).
Надеюсь, это поможет кому-то там :)