【问题标题】:Network calls /.well-known/openid-configuration/ and /.well-known/openid-configuration/jwks网络调用 /.well-known/openid-configuration/ 和 /.well-known/openid-configuration/jwks
【发布时间】:2020-04-02 08:15:41
【问题描述】:

我有:

  • 身份服务器 4,
  • 具有 OpenId Connect 和混合流的 Mvc 应用程序
  • WebApi 应用程序

假设用户已经获得了带有 id_token 和访问令牌的 cookie。 然后他从 mvc app 调用一个动作:

 var client = new HttpClient();
 client.SetBearerToken(accessToken);
// call webapi from mvc
 var content = await client.GetStringAsync("http://localhost:5001/api/resource-with-policy");

在提琴手我看到两个电话:

  • GET /.well-known/openid-configuration/

  • GET /.well-known/openid-configuration/jwks

我假设 WebApi 在操作中看到 [Authorize] 属性并进行这些调用。 这些调用的目的是什么?

WebApi 是这样配置的:

              .AddJwtBearer("Bearer", options =>
              {options.Authority = "<is4-url>";
                  options.RequireHttpsMetadata = false;
                  options.Audience = "Api1";
              });```

【问题讨论】:

    标签: asp.net-core identityserver4


    【解决方案1】:

    这些是 OpenID Connect 协议的一部分。 您的 API 使用第一个请求来发现用于令牌验证的参数。 该配置文件包含例如令牌中期望的有效发行者值。 第二个请求是获取令牌的公共签名密钥。 该 URL 在第一个文档中。

    所以这都是 API 用来验证令牌的数据,所以你不需要手动配置它们。

    【讨论】:

    • 正如您所写的“第二个请求是获取令牌的公共签名密钥”。我需要更详细的解释。我猜这个端点会验证发行者或其他任何东西?
    • 一般来说,签名密钥由应用程序下载一次。然后它拥有验证令牌所需的所有数据,而无需向 IdentityServer 发出任何请求。您的 API 收到的 JWT 具有数字签名。 API 也可以使用公钥生成该签名,并验证它是否与令牌上的签名匹配。这样 API 就知道令牌没有被修改。然后它可以检查到期时间、发行者、受众、范围等。
    • 从 /.well-known/openid-configuration/jwks 如果得到 {"kty":"RSA","use":"sig","kid":"c3130a4f920d2a0023dd14cc0ee92ee7","e" :"AQAB","n":"--", ","alg":"RS256"} 这验证了什么?
    • Kty 可能是键类型。 RSA 表示它使用 RSA 算法,非对称加密。 Use=sig 表​​示此密钥用于数字签名。 Kid 是密钥的 id,在令牌标头中引用。 Alg=RS256 表示具体算法是带有 SHA-256 的 RSA。 e 和 n 是 RSA 的公共参数。任何拥有这些值的人都可以验证签名是否有效。如果您对 RSA 的细节感兴趣:en.wikipedia.org/wiki/RSA_(cryptosystem)
    • 更多关于这个话题的解释在这里:community.auth0.com/t/jwt-signing-algorithms-rs256-vs-hs256/…
    【解决方案2】:

    由安全令牌服务以私钥签名的 JWT 令牌。 JWT 令牌是未加密的数字签名 JSON 有效负载,其中包含用于识别用户的不同属性(声明)。签名是 JWT 的最后一部分,需要用于验证有效负载。此签名是使用标头中描述的算法(例如RS256)生成的,以防止未经授权的访问。有关 JWT 令牌的更多详细信息,请参阅this document

    要验证签名,首先我们应该检索并缓存唱歌令牌(公钥):1)第一个调用是发现端点。它的 URL 形成为 /.well-known/openid-configuration .2) 然后你会在这里找到很多元数据,包括 jwks_uri 端点地址,它将发送获取请求以获取密钥以验证令牌的签名。

    令牌签名是根据 JSON Web Key 规范实现的。使用令牌标头中的密钥 ID 和 X.509 证书指纹值(分别为 kidx5t 参数),然后在获得的密钥集合中找到适当的公钥,以验证与 n(Modulus)e(Exponent) 的签名. Here 是一个代码示例。

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 2022-01-08
      • 2016-10-08
      • 2021-09-09
      • 1970-01-01
      • 2021-09-25
      • 2017-06-23
      • 2022-01-14
      • 2021-11-17
      相关资源
      最近更新 更多