ehwash Ответов: 1

Как получить id_token для keycloak с помощью OWIN?


Я работаю с очень старым человеком. VB.net приложение пытается наложить слой в SSO auth с помощью OWIN и KeyCloak. Все это для меня в новинку. Подход, который я использую, заключается в создании приложения C#, чтобы сидеть между KeyCloak и моим приложением VB. Я смог заставить свое приложение C# открыть экран входа в KeyCloak, пройти аутентификацию и вернуться в приложение C# или даже в приложение VB. Это кажется прекрасным.

Однако мне нужен id_token и имя пользователя для передачи в приложение VB. При использовании Fiddler я вижу, что KeyCloak генерирует сообщение обратно на мою возвращаемую страницу с id_token на буксире. Однако он находится в другом потоке и перенаправляется на исходную страницу, но без id_token. Должно быть, я что-то упустил. Я видел код, где есть проводные уведомления, и я думаю, что они должны захватить маркер и информацию о пользователе, но я не знаю, как заставить уведомления работать. Нет никакой явной документации, чтобы сказать мне, что делать.

Должен ли я иметь слушателя, чтобы поймать сообщение от KeyCloak? Если да, то может ли кто-нибудь показать мне, как его создать?

Примечание: Я нашел некоторый код Microsoft, использующий OWIN, Azure и MVC, которые возвращают информацию о пользователе. Однако я указываю этот же код на KeyCloak, который он аутентифицирует, но никакая информация о пользователе не возвращается.

Любая помощь будет очень признательна.

-Спасибо

В моем файле Startup.cs у меня есть следующее (Я перепробовал много разных вариантов, но безрезультатно):

public void ConfigureAuth(IAppBuilder app)
{
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

    app.UseCookieAuthentication(new CookieAuthenticationOptions());
    app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
        {
            // Sets the ClientId, authority, RedirectUri as obtained from web.config
            ClientId = _clientId,
            ClientSecret = _clientSecret,
            RequireHttpsMetadata = false,
            Authority = _authority,
            RedirectUri = _redirectUri,
            // PostLogoutRedirectUri is the page that users will be redirected to after sign-out. In this case, it is using the home page
            PostLogoutRedirectUri = _redirectUri,
            Scope = OpenIdConnectScope.OpenIdProfile,
            // ResponseType is set to request the id_token - which contains basic information about the signed-in user
            ResponseType = OpenIdConnectResponseType.IdToken,
            // ValidateIssuer set to false to allow personal and work accounts from any organization to sign in to your application
            // To only allow users from a single organizations, set ValidateIssuer to true and 'tenant' setting in web.config to the tenant name
            // To allow users from only a list of specific organizations, set ValidateIssuer to true and use ValidIssuers parameter
            TokenValidationParameters = new TokenValidationParameters()
            {
                ValidateIssuer = true
            },
            // OpenIdConnectAuthenticationNotifications configures OWIN to send notification of failed authentications to OnAuthenticationFailed method
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                AuthenticationFailed = OnAuthenticationFailed,
                SecurityTokenReceived = OnSecurityTokenReceived
            }
        }
    );
}


Что я уже пробовал:

Я тоже пробовал такие вещи:

public void ConfigureAuth(IAppBuilder app)
{
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
    app.UseCookieAuthentication(new CookieAuthenticationOptions());

    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
        ClientId = _clientId,
        ClientSecret = _clientSecret,
        Authority = _authority,
        RequireHttpsMetadata = false,
        RedirectUri = _redirectUri,
        ResponseType = OpenIdConnectResponseType.CodeIdToken,
        Scope = OpenIdConnectScope.OpenIdProfile,
        //MetadataAddress = $"{_authority}/.well-known/openid-configuration",
        TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name" },
        Notifications = new OpenIdConnectAuthenticationNotifications
        {
            AuthorizationCodeReceived = async n =>
            {
                var client = new HttpClient();

                var tokenResponse = await client.RequestAuthorizationCodeTokenAsync(new AuthorizationCodeTokenRequest
                {
                    Address = $"{ _authority}/protocol/openid-connect/token",
                    ClientId = _clientId,
                    ClientSecret = _clientSecret,
                    Code = n.Code,
                    RedirectUri = _redirectUri,
                });

                if (tokenResponse.IsError)
                {
                    throw new Exception(tokenResponse.Error);
                }

                var response = await client.GetUserInfoAsync(new UserInfoRequest
                {
                    //Address = disco.UserInfoEndpoint,
                    Token = tokenResponse.IdentityToken,
                    Address = $"{ _authority}/protocol/openid-connect/userinfo",
                    ClientId = _clientId,
                    ClientSecret = _clientSecret,
                    //Code = n.Code,
                    //RedirectUri = _redirectUri
                });

                if (response.IsError)
                {
                    throw new Exception(response.Error);
                }

                var claims = response.Claims;

                n.AuthenticationTicket.Identity.AddClaims(claims);
            },
        },
    });
}

1 Ответов

Рейтинг:
1

BillWoodruff

Цитата:
Все это для меня в новинку ... Должен ли я иметь слушателя, чтобы поймать сообщение от KeyCloak? Если да, то может ли кто-нибудь показать мне, как его создать?

Примечание: Я нашел некоторый код Microsoft, использующий OWIN, Azure и MVC, которые возвращают информацию о пользователе. Однако я указываю этот же код на KeyCloak, который он аутентифицирует, но никакая информация о пользователе не возвращается.
KeyCloak имеет активный форум поддержки: [^]: это, вероятно, хорошее место, чтобы задать этот конкретный вопрос KeyCloak.


ehwash

Я смог получить данные, которые искал, самостоятельно... до определенного момента. что подводит меня к следующему вопросу, который я задам в другой теме. Сайт KeyCloak не давал никаких ответов.