c# OpenIdConnect 身份验证

c# OpenIdConnect authentication

我正在尝试使用 keycloack 保护 API。 API 由服务器调用。所以没有浏览器。

(通过浏览器登录正常,我可以访问 api。)

当我尝试通过 curl 或 Postman 调用 API 时,我被重定向到 keycloak 的登录站点(就像在浏览器中一样)。无论我是否提供访问承载令牌,都会发生这种情况。

为什么我无法访问?令牌是应该以某种方式跳过登录的东西...

这些是我使用的 curl 命令:

export TOKEN=$(curl -k -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=test" \
  -d "username=test@test.de" \
  -d "password=123456" \
  -d "grant_type=password" \
  -d "client_secret=fefaefaefaseeas" \
  -X POST https://XXXXX/protocol/openid-connect/token | jq -r .access_token)

echo $TOKEN

curl -i -k -X GET -H "Authorization: Bearer $TOKEN" https://localhost:5001/api-test

这是 API 所在的代码:

.AddOpenIdConnect("oidc", options =>
 {
     options.Authority = "https://xxxxx/auth/realms/master";
     options.ClientId = "test";

     // For testing we disable https (should be true for production)
     options.RequireHttpsMetadata = false;
     options.SaveTokens = true;
                    
     // Client secret shared with Keycloak
     options.ClientSecret = "fefaefaefaseeas";
     options.GetClaimsFromUserInfoEndpoint = true;

     // OpenID flow to use
     options.ResponseType = OpenIdConnectResponseType.Code; 
});

API 的工作是验证访问令牌,并且没有浏览器重定向。所以你的代码应该是这样的:


services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
    options.Authority = oidcMetadataEndpoint;
    options.TokenValidationParameters = new 
    TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = "myissuer",
        ValidateAudience = true,
        ValudAudience = "api.mycompany.com",
    };
});

您正在使用导致重定向的网站技术堆栈。使用上述 API 技术堆栈时,如果您发送无效令牌而不是重定向响应,您将收到 401 错误响应。