В соответствии с этим OpenID spe c https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0.html
Поток аутентификации, инициированной клиентом OpenID Connect, является потоком аутентификации, подобным OpenID Connect. Однако, в отличие от OpenID Connect, существует прямая связь между проверяющей стороной и поставщиком OpenID без перенаправлений через браузер пользователя. Эта спецификация имеет концепцию устройства потребления (на котором пользователь взаимодействует с проверяющей стороной) и устройства аутентификации (на котором пользователь проходит аутентификацию с помощью поставщика OpenID и дает согласие). Эта спецификация позволяет проверяющей стороне, имеющей идентификатор для пользователя, получать токены от поставщика OpenID. Пользователь запускает поток с проверяющей стороной на устройстве потребления, но аутентифицирует и дает согласие на устройстве аутентификации.
Я пытаюсь сделать то же самое с моим. NET core api, используя Keycloak как IdentityProvider. Это текущая рабочая настройка с потоком кода авторизации
var oidcOptions = new OpenIdConnectAuthenticationOptions()
{
AuthenticationType = OpenIdConnectAuthenticationDefaults.AuthenticationType,
ClientId = Application.Config.KeycloakConfig.Default.ClientId,
Authority = Application.Config.KeycloakConfig.Default.Authority,
RedirectUri = Application.Config.KeycloakConfig.Default.SiteManagementAuthRedirectUri,
ClientSecret = Application.Config.KeycloakConfig.Default.ClientSecret,
RequireHttpsMetadata = false,
ResponseType = OpenIdConnectResponseType.CodeIdToken,
Scope = "openid",
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
RequireExpirationTime = true,
IssuerValidator = (issuer, securityToken, validationParameters) =>
{
if (issuer != Application.Config.KeycloakConfig.Default.Authority)
throw new SecurityTokenInvalidIssuerException("Invalid issuer");
return issuer;
},
ValidAudience = Application.Config.KeycloakConfig.Default.ClientId
},
SignInAsAuthenticationType = "Cookies",
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = OnAuthenticationFailed,
RedirectToIdentityProvider = OnRedirectToIdentityProvider
}
};
appBuilder.UseOpenIdConnectAuthentication(oidcOptions);
Мне удалось получить токены с использованием пароля, как показано ниже
HTTP POST {{KeyCloakUrl}}/realms/My-Realms/protocol/openid-connect/token
{
grant_type: "password",
client_id: "Keycloak_client_id",
client_secret: "***",
username: "username i created in Keycloak",
password: "***",
response_type : "code id_token",
scope: "openid"
}
Ответ:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI***********",
"expires_in": 300,
"refresh_expires_in": 1800,
"refresh_token": "eyJhbGciOiJ********",
"token_type": "bearer",
"id_token": "eyJhbG**********",
"not-before-policy": 0,
"session_state": "c2803e20-bc04-4a9c-9b1a-d1fd3dfd1f22",
"scope": "openid email profile"
}
Вопрос : Можно ли вручную выполнить запрос POST с id_token
к. NET core api для аутентификации запросов и как это сделать?