我有:
假设用户已经获得了带有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";
});```
答案 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证书指纹值(分别为kid
和x5t
参数),然后在获得的密钥集合中找到适当的公钥,以使用{{1 }}和n(Modulus)
。 Here是一个代码示例。
答案 1 :(得分:0)
这些是OpenID Connect协议的一部分。 您的API使用第一个请求来发现用于令牌验证的参数。 该配置文件包含例如令牌中期望的有效发行者值。 第二个请求是获取令牌的公共签名密钥。 该URL在第一个文档中。
因此,API会使用所有用于验证令牌的数据,因此您无需手动配置它们。