【问题标题】:IdentityServer4 - Calling API from IProfileService implementationIdentityServer4 - 从 IProfileService 实现调用 API
【发布时间】:2020-07-17 15:45:14
【问题描述】:

我正在开发一个使用 IdentityServer4 对用户进行身份验证的 MVC Web 项目,然后该 Web 应用程序使用 IdentityServer(授权代码流)提供给用户的访问令牌来调用 API。 IdentityServer 已配置为使用 Azure AD 作为外部身份提供程序,这是用户登录的主要机制。这一切都很好。

通过身份验证后,我需要查询网络应用的数据库以确定:

  • 如果用户帐户被授权登录
  • 检索特定于应用程序的用户声明

IdentityServer 文档 (http://docs.identityserver.io/en/latest/reference/profileservice.html) 建议为此实现 IProfileService 接口,我已经这样做了。我希望 ProfileService 调用 Web 应用程序的 API 来检索有关用户的信息,以避免强制 IdentityServer 需要了解/直接访问数据库。然而,我的问题是调用 API 虽然需要访问令牌。

是否可以在 ProfileService 的 IsActiveAsync / GetProfileDataAsync 方法中检索当前用户的令牌?我找不到可靠的文档来确定令牌是否在那时生成。在身份验证/授权方面,我也是个菜鸟,这是一个很大的话题!

我的想法是使用 ProfileService 中的客户端凭据流来调用 API,只是为了填充初始令牌。但是,我不知道这是否是一个绝对糟糕的想法......或者是否有任何更好的概念可以让我参考我可以调查。

谁能指出我正确的方向?

【问题讨论】:

    标签: identityserver4 bearer-token


    【解决方案1】:

    查看ITokenCreationService,它是identityserver4 的一部分。您可以将该服务注入到您的 IProfileService 实现中,然后使用您喜欢的任何声明创建一个新的不记名令牌。

    例如:

    protected readonly ITokenCreationService _tokenCreationService;
    
    ...
    
    var token = new Token
    {
        AccessTokenType = AccessTokenType.Jwt,
        Issuer = "https://my.identityserver.com",
        Lifetime = (int)TimeSpan.FromMinutes(5).TotalSeconds,
        Claims = GetClaimsNeededForApiCall()
    };
    
    string myToken = await _tokenCreationService.CreateTokenAsync(token);
    
    ...
    
    

    【讨论】:

      【解决方案2】:

      无法在 ProfileService 中检索用户的 access_token。 每当 IdentityServer 需要返回有关用户的声明时,都会调用配置文件服务。这意味着如果您尝试在 ProfileService 中为用户生成令牌,它将再次调用 ProfileService。

      【讨论】:

      • 谢谢@nahidf,您能否建议任何替代方法,让我能够实现我所描述的,而无需强制 IdentityServer 拥有远程 API 的过多知识(或数据访问代码)?您对 mackie 的回答是否有任何反馈,这似乎可以满足我的需求。
      • 您可以调用受保护的api,但该api不需要为该用户颁发access_token。我猜 macki 的答案是在我看到代码时发出一个用户不可知的令牌,你可以试试,让我知道发生了什么
      • 在一天结束时,令牌只是声明的签名集合。我们在我的回答中使用了该方法,以保证生产中的良好效果。您只需要提前知道您调用的 API 需要什么声明。
      猜你喜欢
      • 2018-06-25
      • 2023-02-20
      • 2017-12-09
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2018-02-06
      相关资源
      最近更新 更多