Добавить заявки на токен доступа в зависимости от клиентов - PullRequest
0 голосов
/ 04 марта 2019

У меня есть ситуация, когда одному веб-приложению нужен токен доступа с одной заявкой, а другому веб-приложению нужна другая заявка.

Например, client_1 должен иметь токен доступа с заявкой is_admin и client_2должен иметь претензию stores.

Что я хочу знать - нормально ли добавлять такую ​​информацию в токен доступа таким способом или есть лучшая альтернатива?

И еслидобавить эту информацию в токен - можете ли вы подсказать, как определить, какую заявку добавить в реализацию IProfileService в зависимости от клиента?Хорошо ли использовать ClientProperties для этой цели?

ОБНОВЛЕНИЕ: я использую Azure AD в качестве внешнего поставщика удостоверений, и у пользователей нет таких утверждений - мне нужно получить его из других источников

1 Ответ

0 голосов
/ 04 марта 2019

В вашей конфигурации добавьте 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».

...