网络调用 /.well-known/openid-configuration/ 和 /.well-known/openid-configuration/jwks

Lap*_*mir 2 asp.net-core identityserver4

我有 :

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

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

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

在 fiddler 中我看到两个调用:

  • 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";
              });```

Run Code Online (Sandbox Code Playgroud)

Nan*_* Yu 7

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

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

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