将 .NET Core 中的 keycloak 1.5.2 迁移到 2.5.3

问题描述 投票:0回答:1

我创建了一个 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 中的所有角色。

.net asp.net-core keycloak
1个回答
0
投票

看起来从 Keycloak

1.5.2
2.5.3
的迁移在
.NET Core
集成中配置身份验证和授权的方式引入了一些重大更改。我将逐步解释如何解决该问题。

改变了什么?

在 Keycloak

2.5.3
中,该库使用更简化的方法来使用
AddKeycloakWebApiAuthentication
AddKeycloakAuthorization
配置身份验证和授权。这简化了配置,但需要确保:

  1. appsettings.json
    中的设置与预期结构相符。
  2. 正确设置基于角色的访问和授权策略。

您遇到的

401
403
错误可能是由于:

  • appsettings.json
    中的设置
    配置错误。
  • 授权与令牌的角色或范围不匹配

解决方案:确保正确配置

  1. 更新

    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"
        }
      }
    }
    
  2. 更新

    Program.cs

    使用新方法调用来配置Keycloak:

    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();
    
  3. 验证Keycloak中的角色映射

    • 确保 Keycloak 中的角色与您的代码所期望的相符。例如,如果您使用
      [Authorize(Roles = "Read")]
      ,则必须将
      Read
      角色分配给 Keycloak 中的用户或客户端。
    • 角色应作为
      access_token
      realm_access
      的一部分添加到
      resource_access
  4. 检查代币内容
    使用 jwt.io 或类似调试器等工具解码您的 JWT 令牌,以确保包含角色。寻找:

    "realm_access": {
      "roles": ["Read", "Write"]
    }
    

    如果角色缺失:

    • 检查Keycloak客户端配置。
    • 确保在 Keycloak 中为您的客户端启用“允许完整范围”。
    • 验证用户在 Keycloak 中具有所需的角色。
  5. 控制器实现
    您的控制器看起来正确,但请确保

    [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" });
        }
    }
    
  6. 可选调试
    如果还是不行:

    • 启用日志记录以调试身份验证过程:
      builder.Logging.ClearProviders();
      builder.Logging.AddConsole();
      
    • 检查日志是否有任何授权失败。

回顾

要解决

401
403
问题:

  1. 确保
    appsettings.json
    与新的预期格式匹配。
  2. 更新
    Program.cs
    以使用新的Keycloak配置方法。
  3. 验证 JWT 令牌中的角色是否与您的
    [Authorize]
    属性一致。
  4. 调试令牌和日志以识别任何不匹配或缺失的角色。

通过这些更改,您的 Keycloak

2.5.3
集成应该可以顺利进行。


如果您遇到其他问题,请告诉我! 😊

© www.soinside.com 2019 - 2024. All rights reserved.