这个周末我开始使用 Identity Server 4,它的易用性给我留下了深刻的印象,感觉我已经很好地掌握了创建 access_token 的过程。一直在使用 Implicit- 和 ResourceOwner-Flow 来创建令牌。
我的问题是我的 identityserver3 wep api 无法验证创建的 JWT,当我使用 jwt.io 进行手动验证时它也会失败。
示例令牌:
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Iiwia2lkIjoiRkRFQUE5NTBDRjczODM0MzEwNTZBNzY3Mjc1RTNEMzE5N0VERDJGOSIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0NjMzNDM2MjgsImV4cCI6MTQ2MzM0NzIyOCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwL3Jlc291cmNlcyIsImNsaWVudF9pZCI6ImJyZnBvcnRhbF9hcGkiLCJzY29wZSI6ImJyZnBvcnRhbGJhY2tlbmQiLCJzdWIiOiIyIiwiYXV0aF90aW1lIjoxNDYzMzQzNjI4LCJpZHAiOiJpZHNydiIsInVuaXF1ZV9uYW1lIjoidGVzdCIsImJyZklkIjowLCJhcHROYnIiOiIwIiwiYW1yIjpbInBhc3N3b3JkIl19.iUvP7jVYSZPXozF0htLbaRrl_iqz_JOIczU5WpIoA5RHfgY17YGN4ERm-8NNPvXQBgJDe2ZeCpLV3MJR4smSOxNOBlzWWlgGApl5VauE62L0POxUnwzRFt2OYh5MVcilz0hRaKstB02EPXy-rDmgsNY8u_iT0bPU8bDD0XTETPy7QRldSMNKfUmeMOC0y8RQYypmXlZsO89HlseyfqE4kptruAho_EIp61qQ3CchJrkXwSB9YBWz4PrJHAiEA_ntzskOQ7K_96jQYZDH2NxaIQRKz7RPZWQreZHtnM7tUG6PNYI02raUFF7w8SQFTjjKUBQROcPezKZMtgFiv-c2Ww
我看到的一个问题是,根据我的理解,web api 将检查
http://localhost:5000/.well-known/openid-configuration/jwks
为公钥中的公钥。据我所知,公钥在“x5c”字段中可用,但是当我在 jwt.io 上使用它进行验证时,它不起作用。
"keys": [
{
"kty": "RSA",
"use": "sig",
"kid": "_eqpUM9zg0MQVqdnJ149MZft0vk",
"x5t": "_eqpUM9zg0MQVqdnJ149MZft0vk",
"x5c": [
"MIIDFTCC..."
]
}
]
FDEAA950CF7383431056A767275E3D3197EDD2F9
是我的证书指纹,与我的 JWT 的“孩子”字段相同。但是 jwks 响应的“孩子”字段不应该相同吗?
这是我在身份服务器中的代码:
使用 InMemory 配置为客户端、范围和用户设置 identityserver4。这似乎确实有效,就像获取包含正确数据的 JWT 一样。
var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
var certCollection = certStore.Certificates.Find(
X509FindType.FindByThumbprint,
"FDEAA950CF7383431056A767275E3D3197EDD2F9",
false);
if (certCollection.Count > 0)
{
var cert = certCollection[0];
var builder = services.AddIdentityServer(options =>
{
options.SigningCertificate = cert;
options.RequireSsl = true;
});
builder.AddInMemoryClients(Clients.Get());
builder.AddInMemoryScopes(Scopes.Get());
builder.AddInMemoryUsers(Users.Get());
}
我没有在这里添加我的 Clients、Scopes 和 Users 类,因为我认为问题不在于那里。
这是我在 Web API 中使用 IdentityServer3.AccessTokenValidation 的代码:
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "http://localhost:5000",
RequiredScopes = new[] { "testscope" }
});
我可以看到我的 API 从日志中访问身份服务器,但在尝试在我的过程中发现问题后,我仍然收到“此请求的授权已被拒绝”。对于每个请求。