В вашей конфигурации добавьте IdentityResource, который представляет область клиентского приложения, например client_1_scope
, включая IdentityClaim is_admin
.
Сделайте то же самое для client_2_scope
, включая IdentityClaim stores
.Также разрешите клиенту запрашивать определенную область (добавьте запись в ClientScopes).
В client_1 запросите область действия client_1_scope
примерно так:
options.Scope.Add("client_1_scope");
А в client_2 вот так:
options.Scope.Add("client_2_scope");
Когда у пользователя есть претензия is_admin
или stores
, претензия будет включена как часть только запрошенной области действия.
Добавить этострока, подтверждающая добавление претензий:
options.GetClaimsFromUserInfoEndpoint = true;
В приложении client_1 конфигурация может выглядеть примерно так:
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services
.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.MapAll();
options.Scope.Add("client_1_scope");
options.Authority = "";
options.ClientId = "";
options.ClientSecret = "";
options.ResponseType = "code id_token";
});
Информация будет сохранена в файле cookie.Если вы хотите, чтобы заявки были частью токена доступа, отправляемого в Api, вам следует использовать таблицы Api для настройки заявок.
Если эти другие источники уже существуют, вы можете реализовать IProfileService.где вы можете добавить динамические утверждения на основе области, как описано выше, поэтому вам все равно нужно запросить область.
Что-то вроде:
using IdentityServer4.Models;
using IdentityServer4.Services;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
public class MyProfileService : IProfileService
{
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
// Include configured claims.
context.AddRequestedClaims(context.Subject.Claims);
// The service gets called multipe times. In this case we need
// the UserInfo endpoint because that's where the scope is defined.
if (context.Caller == "UserInfoEndpoint")
{
// Get the value from somewhere and transform to a list of claims.
// You can filter by requested scopes
List<Claim> userClaims = GetUserClaims(context.RequestedResources.IdentityResources);
if (userClaims.Any())
context.IssuedClaims.AddRange(userClaims);
}
}
public async Task IsActiveAsync(IsActiveContext context)
{
context.IsActive = true;
}
}
Если вы хотите добавить утверждения ктокен доступа (используется для API), затем context.Caller - ClaimsProviderAccessToken, и вы должны посмотреть на context.RequestedResources.ApiResources.
Зарегистрировать службу при запуске:
.AddProfileService<MyProfileService>()
Обратите внимание, этоэто просто пример.Я не тестировал код.
Имея отдельный источник, вы также можете посмотреть на PolicyServer .В этом случае вы можете оставить IdentityServer для аутентификации и PolicyServer для авторизации «opt-in».