我正在尝试和KeyCloak一起在dotnet webapi上实现签名的JWT (RS256)。在app start上,我可以看到使用预期的响应内容(如下所示的请求)对keycloak进行的openid调用。
在这里获取jwks_url
GET https://localhost:8080/auth/realms/core/.well-known/openid-configuration
从这里拿钥匙
GET https://localhost:8080/auth/realms/core/protocol/openid-connect/certs
然后,我得到一个带有以下请求的access_token
POST https://localhost:8080/auth/realms/core/protocol/openid-connect/token
Content-Type: application/x-www-form-urlencoded
grant_type=password&client_id=admin-cli&username=jim&password=foobar
然后,我测试了以下端点
[ApiController]
[Route("/")]
public class AppController : ControllerBase
{
[Authorize]
[HttpGet]
public OkObjectResult Get()
{
return Ok("This is the secured page");
}
}
使用此请求
GET https://localhost:5001
Authorization: Bearer MY_TOKEN
但我总是得401分
HTTP/1.1 401 Unauthorized
Content-Length: 0
Date: Wed, 18 Nov 2020 17:41:28 GMT
Server: Kestrel
Www-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found"
令牌中确实存在签名密钥(第三个“块”)。下面是JWT验证代码。我是不是遗漏了什么?
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
var audience = Configuration["Jwt:Audience"];
var issuer = Configuration["Jwt:Issuer"];
bool.TryParse(Configuration["Jwt:RequireHttpsMetadata"], out var requireHttpsMetadata);
IConfigurationManager<OpenIdConnectConfiguration> configurationManager =
new ConfigurationManager<OpenIdConnectConfiguration>(
$"{Configuration["Jwt:Authority"]}/auth/realms/core/.well-known/openid-configuration",
new OpenIdConnectConfigurationRetriever());
var openIdConfig =
configurationManager.GetConfigurationAsync(CancellationToken.None).Result;
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = requireHttpsMetadata;
options.TokenValidationParameters.IssuerSigningKeys = openIdConfig.SigningKeys;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidIssuer = issuer,
ValidAudience = audience,
ValidateIssuerSigningKey = true,
};
});
}
发布于 2020-11-19 03:32:35
因为JWT拥有一个签名(也就是第三个块),所以我将解释消息
"The signature key was not found"
签名的验证有问题。
重新检查响应/可访问性
GET https://localhost:8080/auth/realms/core/protocol/openid-connect/certs
https://stackoverflow.com/questions/64898856
复制相似问题