Вход в обратный канал Keycloak с. NET core api? - PullRequest
1 голос
/ 14 февраля 2020

В соответствии с этим 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 для аутентификации запросов и как это сделать?

...