【问题标题】:Including additional claims within Access Token在访问令牌中包含其他声明
【发布时间】:2021-03-19 07:49:25
【问题描述】:

我正在关注用于调用后端 API 的 JS SPA 的 IdentityServer 4 示例。但是在 API(.NET CORE)中一切正常,我从 js 客户端获取访问令牌。此时,我可以使用 userinfo 端点(在身份服务器上)来捕获有关用户的更多信息。这工作正常。 问题/问题是,对于每个 API 调用,我必须调用此 userinfo 端点来识别用户,因为单独的访问令牌没有用户信息。

在使用访问令牌和后端 API(来自 JS 客户端)时有什么建议。建议是 a) 继续在每个 API 调用上调用 UserInfo 端点(这似乎是性能问题) b) 将 ajax 请求作为参数或其他标头信息发送用户信息(似乎不安全) c) 在 API 服务器上为访问令牌与用户关系做某种缓存(感觉不对) d) 弄清楚如何在访问令牌中添加用户信息。我已经读到使用访问令牌包含用户信息是不明智的

还有其他选择吗?

我的场景似乎很常见,JavaScript 客户端访问后端 API 并需要了解用户信息。

【问题讨论】:

    标签: oauth-2.0 identityserver4 openid-connect


    【解决方案1】:

    我会尽量减少 ID/访问访问令牌,特别是如果您有 SaveTokens=true,那么您的 asp.net 核心会话 cookie 会非常大!

    最好从用户信息端点查找用户详细信息,然后缓存它。

    为什么需要在每个 API 请求上调用 UserInfo 端点?

    【讨论】:

      【解决方案2】:

      由于您没有在此处提供任何示例代码,我假设您在 .NET API 中使用以下代码来验证令牌。

      services.AddAuthentication().AddOpenIdConnect(Authentication.OidcAuthenticationScheme, 
       options =>
        {
         options.Authority = "IdS4 URL";
         options.SaveTokens = true;
         options.GetClaimsFromUserInfoEndpoint = true;
        });
      

      如果是这种情况,那么是的,您的 API 将在每个请求上调用 connect/userinfo 端点以获取额外的声明,这将是 ID4 令牌提供者的一次往返。

      回答您关于在访问令牌中添加用户信息的问题/疑虑:实际上,这取决于您尝试在访问令牌中放入什么样的信息。如果不是 PII,那么我建议在访问令牌本身中添加信息,并使用 .AddIdentityServerAuthentication() 中间件进行令牌验证。

      例如

      services.AddAuthentication()
              .AddIdentityServerAuthentication(options =>
              {
                //ToDo: Add your configuration here
              });
      

      希望这个回答对你有帮助!

      【讨论】:

      • 我不会再使用 IdentityServer4.AccessTokenValidation 库了。 From the official Github site: “此库已弃用,不再维护。”。 Use one of these approachs 代替。
      • @Alpha75 我同意你的观点,我只是想摆脱.AddOpenIdConnect() 扩展方法,使用.AddIdentityServerAuthentication().AddJwtBearer()。最初,我遇到了多个问题,其中此扩展程序验证身份令牌而不是访问令牌。
      【解决方案3】:

      我将从设计您希望在 API 中使用的声明开始。声明并不总是需要包含在访问令牌中并返回给客户端。例如,可以返回一个不透明的引用令牌或者它是一个小的 JWT。正如 Tore 所说,我的目标是使访问令牌保持小而机密。

      通常在这些位置之一使用某种形式的声明缓存。您选择的解决方案通常取决于您的中间件的复杂程度。

      • 授权服务器
      • API 网关
      • API

      我的API Authorization Blog Post 可能会为您提供一些可以用于您自己的解决方案的想法。我的 .Net Core API 使用自定义身份验证处理程序在 API 本身中进行声明缓存,因为我正在使用 AWS Cognito,它的访问令牌功能非常有限。

      【讨论】:

        猜你喜欢
        • 2017-03-23
        • 2021-12-27
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        • 2019-09-13
        • 2020-11-05
        • 1970-01-01
        相关资源
        最近更新 更多