繁体   English   中英

是否有任何IdentityServer4服务(而不是端点)用于令牌处理?

[英]Are there any IdentityServer4 services (not endpoints) for token handling?

我在同一个项目中有IdentityServer4和Web API,我想在我自己的控制器中使用IdentityServer令牌处理,例如我想在我自己的控制器中发出令牌,刷新标记,撤销令牌而不调用其他内置的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);
    }

我不认为,进入经过认证的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 但是,其目的是帮助从IdSrv中调用外部API,而不是通过外部请求发出任何JWT。

如果您需要从外部请求JWT(并遵循协议),则必须使用预定义的端点和签名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM