【问题标题】:Are there any IdentityServer4 services (not endpoints) for token handling?是否有任何用于令牌处理的 IdentityServer4 服务(不是端点)?
【发布时间】:2019-03-29 15:27:39
【问题描述】:

我在同一个项目中有 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);
    }

【问题讨论】:

  • 请分享您的代码
  • IdentityServer 只是一个 API,它是一个非常专业的 API,但仍然是一个 API。因此,您可以像使用任何其他 API 一样通过 HttpClient 与它进行交互。如果您想要一个“服务”,只需创建一个包含HttpClient 的类并将您需要作为方法进行的调用公开。然后你就可以在你的应用程序中使用这个类了。
  • @Chris Pratt 我不认为这是真的,有像 IIdentityServerInteractionService (docs.identityserver.io/en/latest/reference/…) 这样的服务可以让你在服务级别上做一些事情,例如撤销令牌和东西,我需要类似的东西,可用于 API 的完整令牌管理(处理令牌和刷新令牌)

标签: c# asp.net-core identityserver4


【解决方案1】:

我不认为,进入经过认证的 IdP 并按照您自己的顺序调用内部组件是个好主意,而不是协议定义的顺序。

不过,您可以通过查看 the implementation 并调用或覆盖来做到这一点。 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(并遵循协议),则必须使用预定义的端点和签名。

【讨论】:

  • 我编辑了原始问题,所以基本上我需要实现令牌处理的服务(获取accesstoken和refreshtoken,用refreshtoken刷新accestoken,撤销refreshtoken),我可以在我自己的控制器中使用(无需调用其他端点)。希望现在更清楚了
  • 可以通过资源所有者密码流程获取访问权和刷新令牌。您无法注销,因为在这种情况下根本没有会话。当你从 JWT 切换到引用令牌时有更多的可能性,但我认为你不打算这样做
  • 我知道这些东西有端点,但正如我所提到的,我需要服务,做同样的事情,我不想在我的自定义端点中调用其他端点。
  • 您的意思是 services 就 ASP.NET Core DI 架构而言?很难从你的问题中得到它。因此,您希望能够从 IdSrv 主机应用程序中创建任何有效的令牌,对吗?如果是这样,请查看 IdentityServerTools [docs.identityserver.io/en/latest/topics/tools.html]
  • 谢谢,你知道刷新令牌处理的类似内容吗?
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2020-01-13
相关资源
最近更新 更多