Существуют ли какие-либо службы IdentityServer4 (не конечные точки) для обработки токенов? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть IdentityServer4 и веб-API в одном проекте, и я хотел бы использовать обработку токенов IdentityServer в своих собственных контроллерах, например, я хочу выпускать токены, refreshtokens, отзывать токены в моих собственных контроллерах, не вызывая другие встроенные IdentityServerконечные точки.Есть ли услуги для таких вещей, которые мне не хватает?Спасибо

Мне нужно что-то вроде someIdentityServerService ниже

    [AllowAnonymous]
    [HttpPost("login")]
    public async Task<IActionResult> Login([FromBody] UserLoginRequestDto model)
    {
        var user = await _userManager.FindByEmailAsync(model.Email);
        if (user == null || !await _userManager.CheckPasswordAsync(user, model.Password))
        {
            return BadRequest("Wrong email or password!");
        }

        // do some other stuff

        var token = await someIdentityServerService.GetAccessTokenAsync(user);
        return Ok(token);
    }

1 Ответ

0 голосов
/ 01 апреля 2019

Я не думаю, что это хорошая идея - зайти внутрь сертифицированного IdP и вызвать внутренние органы в своем собственном порядке, а не в порядке, определенном протоколом.

Тем не менее, вы можете сделать это, взглянув на реализацию и вызывая или переопределяя. Identity Server очень гибок, используя стандартный DI, вы можете переопределить практически все.

например

            var identityPricipal = await _principalFactory.CreateAsync(user);
            var identityUser = new IdentityServerUser(user.Id.ToString())
            {
                AdditionalClaims = identityPricipal.Claims.ToArray(),
                DisplayName = user.UserName,
                AuthenticationTime = DateTime.UtcNow,
                IdentityProvider = IdentityServerConstants.LocalIdentityProvider
            };
            var request = new TokenCreationRequest();
            request.Subject = identityUser.CreatePrincipal();
            request.IncludeAllIdentityClaims = true;
            request.ValidatedRequest = new ValidatedRequest();
            request.ValidatedRequest.Subject = request.Subject;
            request.ValidatedRequest.SetClient(Config.Clients().First());
            request.Resources = new Resources(Config.IdentityResources(), new List<ApiResource>());
            request.ValidatedRequest.Options = _options;
            request.ValidatedRequest.ClientClaims = identityUser.AdditionalClaims;
            var token = await _tokenService.CreateAccessTokenAsync(request);
            token.Issuer = "...";
            return await _tokenService.CreateSecurityTokenAsync(token);

Более удобный способ создания токенов - использовать IdentityServerTools . Однако цель состоит в том, чтобы помочь вызывать внешние API изнутри IdSrv, а не выдавать какие-либо JWT по внешним запросам.

Если вам нужно запросить JWT извне (и следовать протоколу), вы должны использовать предопределенные конечные точки и подписи.

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