Как получить свои претензии в моем токене доступа при использовании нового шаблона SPA IdentityServer для Angular? - PullRequest
1 голос
/ 26 октября 2019

Я использую следующее руководство по настройке проекта IdentityServer4 Angular по умолчанию: https://docs.microsoft.com/ja-jp/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-3.0

Я хочу сделать запрос к конечной точке контроллера с этим и получить идентификатор пользователя (сохраненный вбазы данных).

Самый быстрый способ сделать это, по-видимому, поместить идентификатор пользователя в токен JWT в качестве утверждения, я попытался сделать это с помощью IProfileService. Это выглядит так:

 public class CustomClaimProfileService: IProfileService
{
    private readonly IUserClaimsPrincipalFactory<ApplicationUser> _claimsFactory;
    private readonly UserManager<ApplicationUser> _userManager;

    public CustomClaimProfileService(IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory, UserManager<ApplicationUser> userManager)
    {
        _claimsFactory = claimsFactory;
        _userManager = userManager;
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        var subId =  context.Subject.GetSubjectId();
        var user = await _userManager.FindByIdAsync(subId);
        var principal = await _claimsFactory.CreateAsync(user);

        var claims = principal.Claims.ToList();
        claims = claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList();
        claims.Add(new Claim(JwtClaimTypes.Id, user.Id));

        context.IssuedClaims = claims;

    }

    public async Task IsActiveAsync(IsActiveContext context)
    {
        context.IsActive = true;
    }
}

Добавление службы в качестве моей последней службы в ConfigureServices, например:

services.AddTransient<IProfileService, CustomClaimProfileService>();

Я хотел использовать метод AddProfileService <> (), который я виделотчеты работают лучше, но это не работает, даже когда я помещаю оба файла с использованием IdentityServer4 в свой файл и имею пакет nuget IdentityServer4, поэтому не уверен, в чем проблема.

Я видел сообщения людей, говорящих AddTransientхотя это также должно работать, если вы поставите его в конце.

Теперь пытаемся получить доступ к заявке следующим образом:

        // POST: api/PracticeSession
    [HttpPost]
    public InitialPracticeRequestResult Post([FromBody] InitialPracticeRequest request)
    {
        var idClaim = User.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).FirstOrDefault();

        if (idClaim != null)
        {
            return initialSessionRequestHandler.InitializePracticeSession(request, idClaim.Value);
        }

        else
        {
            throw new ArgumentException();
        }
    }

Заявки пользователя пусты, я проверил с помощью отладчика ипохоже, GetProfileDataAsync не вызывается.

Итак, теперь я прочитал, что перед тем, как заявка фактически будет введена в токен, необходимо указать эту заявку как одну из заявок, которые должны быть в токене при определении ресурса. Согласно документам http://docs.identityserver.io/en/latest/reference/identity_resource.html.

Это главный вопрос, который у меня есть сейчас: как мне поступить с этим шаблоном? ?

В соответствии с приведенными выше мс документами о методе AddIdentityServerJWT (), вызываемом в Startup.cs:

AddIdentityServerJwt Этот вспомогательный метод настраивает схему политики для приложения в качестве обработчика аутентификации по умолчанию,Политика настроена так, что Identity может обрабатывать все запросы, направленные на любой подпуть в пространстве URL-адресов Identity "/ Identity". JwtBearerHandler обрабатывает все остальные запросы. Кроме того, этот метод регистрирует ресурс API API <> в IdentityServer с областью по умолчанию <> API и настраивает промежуточное программное обеспечение токенов JWT Bearer для проверки токенов, выпущенных IdentityServer для приложения.

Теперь, покакак я вижу в документации по IdentityServer4, заявки, которые должны быть помещены в токен для ресурса, должны быть определены вместе с самим ресурсом. Насколько я вижу, этот вспомогательный метод уже определил для меня ресурс, так как же тогда определить требования, которые мне нужны в моем токене? Я смотрю в нужном месте?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...