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

时间:2019-12-09 08:47:44

标签: 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");

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

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

  • 获取/.well-known/openid-configuration/jwks

我假设WebApi在执行时看到[Authorize]属性并进行这些调用。 这些电话的目的是什么?

WebApi的配置方式如下:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

因此,API会使用所有用于验证令牌的数据,因此您无需手动配置它们。