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 错误响应。
我正在尝试使用 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 错误响应。