Как получить 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); }, }, }); }