我创建了一个 1.5.2 版本的 Poc,一切正常,但更新到 v2.5.3 后,我的 keycloak 实现崩溃了。
https://github.com/user-attachments/assets/73c614d1-8306-4f2f-a7c2-b0670472a640
1.5.2 类 Program.cs:
var authenticationOptions = builder
.Configuration
.GetSection(KeycloakAuthenticationOptions.Section)
.Get<KeycloakAuthenticationOptions>();
builder.Services.AddKeycloakAuthentication(authenticationOptions);
var authorizationOptions = builder
.Configuration
.GetSection(KeycloakProtectionClientOptions.Section)
.Get<KeycloakProtectionClientOptions>();
builder.Services.AddKeycloakAuthorization(authorizationOptions);
2.5.3 程序.cs 和控制器:
builder.Services.AddKeycloakWebApiAuthentication(builder.Configuration);
builder.Services.AddKeycloakAuthorization(builder.Configuration);
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
[Route("read")]
[HttpGet]
[Authorize(Roles = "Read")]
public async Task<IActionResult> Read()
{
return Ok(Names());
}
}
https://github.com/user-attachments/assets/f0455b0e-5789-4824-a9f5-b6ba5dca5f7b https://github.com/user-attachments/assets/7049a579-c83d-4262-8fd3-55b3b93a7f3d
现在在 2.5.3 中,即使我也拥有代币返回 401 或 403 中的所有角色。
看起来从 Keycloak
1.5.2
到 2.5.3
的迁移在 .NET Core
集成中配置身份验证和授权的方式引入了一些重大更改。我将逐步解释如何解决该问题。
在 Keycloak
2.5.3
中,该库使用更简化的方法来使用 AddKeycloakWebApiAuthentication
和 AddKeycloakAuthorization
配置身份验证和授权。这简化了配置,但需要确保:
appsettings.json
中的设置与预期结构相符。您遇到的
401
和 403
错误可能是由于:
appsettings.json
中的设置配置错误。
更新
appsettings.json
appsettings.json
中的 Keycloak 配置与 2.5.3
的预期结构匹配。这是一个例子:
{
"Keycloak": {
"Realm": "your-realm",
"AuthServerUrl": "https://your-keycloak-server/auth",
"ClientId": "your-client-id",
"ClientSecret": "your-client-secret",
"BearerOnly": true,
"Resource": "your-client-id",
"Credentials": {
"Secret": "your-client-secret"
}
}
}
更新
Program.cs
var builder = WebApplication.CreateBuilder(args);
// Add services for Keycloak authentication and authorization
builder.Services.AddKeycloakWebApiAuthentication(builder.Configuration);
builder.Services.AddKeycloakAuthorization(builder.Configuration);
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
验证Keycloak中的角色映射
[Authorize(Roles = "Read")]
,则必须将 Read
角色分配给 Keycloak 中的用户或客户端。access_token
或 realm_access
的一部分添加到 resource_access
。检查代币内容
使用 jwt.io 或类似调试器等工具解码您的 JWT 令牌,以确保包含角色。寻找:
"realm_access": {
"roles": ["Read", "Write"]
}
如果角色缺失:
控制器实现
您的控制器看起来正确,但请确保
[Authorize]
属性与令牌中的角色一致。示例:
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
[Route("read")]
[HttpGet]
[Authorize(Roles = "Read")]
public IActionResult Read()
{
return Ok(new[] { "Item1", "Item2", "Item3" });
}
}
可选调试
如果还是不行:
builder.Logging.ClearProviders();
builder.Logging.AddConsole();
要解决
401
或 403
问题:
appsettings.json
与新的预期格式匹配。Program.cs
以使用新的Keycloak配置方法。[Authorize]
属性一致。通过这些更改,您的 Keycloak
2.5.3
集成应该可以顺利进行。
如果您遇到其他问题,请告诉我! 😊