Угловой вход "Исключение: корреляция не удалась. Неизвестное местоположение" - PullRequest
1 голос
/ 18 апреля 2019

Мое приложение состоит из 2 элементов: Хост IdentityServer4 (приложение Asp.NET Core 2.2 с удостоверением Asp.NET) прослушивает http://localhost:5000 Приложение Angular Client (Angular v.7.2.12) прослушивает http://localhost:5002

Я хочу, чтобы угловой клиент проходил аутентификацию на IS4: форма входа в систему идентифицируется с той, что размещена на страницах IS4. После успешного входа в систему пользователь должен быть перенаправлен обратно на угловую страницу. Для угловой интеграции oidc я следил за проектом: https://github.com/elanderson/Angular-Core-IdentityServer

Логин действительно работает хорошо (я вижу правильный токен, возвращенный IS4, и нет ошибок в журналах IS4), но URI перенаправления не работает. Вместо возврата к исходной угловой странице (http://localhost/5002) у меня есть исключение «Корреляция не удалась. Неизвестное местоположение»

Я попытался сделать такой же вход в систему с другим тестовым приложением ASP.NET Core, и это работает, поэтому, похоже, это связано с угловой интеграцией.

Exception Stack

Exception Headers

IS4 угловая конфигурация клиента в памяти

new Client
            {
                ClientId = "gekoo.webSPA",
                ClientName = "MVC SPA Client",
                AllowedGrantTypes = GrantTypes.Implicit,
                AllowAccessTokensViaBrowser = true,

                RedirectUris = { "http://localhost:5002/signin-oidc" },                    
                PostLogoutRedirectUris = { "http://localhost:5002" },},

                AllowedCorsOrigins = { "http://localhost:5002" },

                AllowedScopes = new List<string>
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "api1"
                },

                AlwaysIncludeUserClaimsInIdToken = true,

                RequireConsent = false,
            },

Конфигурация основного клиентского приложения Aspnet в Startup.cs ConfigureServices

services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            //options.DefaultChallengeScheme = "oidc";
            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
            .AddCookie()
            .AddOpenIdConnect(options =>
            {
                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;

                options.ResponseType = "code id_token";
                options.Scope.Add("gekoo.webSPA");
                options.Scope.Add("offline_access");
                options.ClientId = "gekoo.webSPA";

                options.ClaimActions.Remove("auth_type");
                options.GetClaimsFromUserInfoEndpoint = true;
                options.SaveTokens = true;
            });

Конфигурация oidc углового клиента:

const openIdImplicitFlowConfiguration = new OpenIDImplicitFlowConfiguration();
openIdImplicitFlowConfiguration.stsServer = authUrl;

openIdImplicitFlowConfiguration.redirect_url = originUrl + '/signin-oidc';
console.log('redirect_url=' + openIdImplicitFlowConfiguration.redirect_url);

openIdImplicitFlowConfiguration.client_id = 'gekoo.webSPA';
openIdImplicitFlowConfiguration.response_type = 'id_token token';
openIdImplicitFlowConfiguration.scope = 'openid profile api1';

openIdImplicitFlowConfiguration.post_logout_redirect_uri = originUrl + '/home';
console.log('post_logout_redirect_uri=' + openIdImplicitFlowConfiguration.post_logout_redirect_uri);

openIdImplicitFlowConfiguration.forbidden_route = '/forbidden';
openIdImplicitFlowConfiguration.unauthorized_route = '/unauthorized';
openIdImplicitFlowConfiguration.auto_userinfo = true;
openIdImplicitFlowConfiguration.log_console_warning_active = true;
openIdImplicitFlowConfiguration.log_console_debug_active = true;
openIdImplicitFlowConfiguration.max_id_token_iat_offset_allowed_in_seconds = 10;

const authWellKnownEndpoints = new AuthWellKnownEndpoints();
//authWellKnownEndpoints.setWellKnownEndpoints(
authWellKnownEndpoints.issuer = authUrl;

authWellKnownEndpoints.jwks_uri = authUrl + '/.well-known/openid-configuration/jwks';
authWellKnownEndpoints.authorization_endpoint = authUrl + '/connect/authorize';
authWellKnownEndpoints.token_endpoint = authUrl + '/connect/token';
authWellKnownEndpoints.userinfo_endpoint = authUrl + '/connect/userinfo';
authWellKnownEndpoints.end_session_endpoint = authUrl + '/connect/endsession';
authWellKnownEndpoints.check_session_iframe = authUrl + '/connect/checksession';
authWellKnownEndpoints.revocation_endpoint = authUrl + '/connect/revocation';
authWellKnownEndpoints.introspection_endpoint = authUrl + '/connect/introspect';
authWellKnownEndpoints.introspection_endpoint = authUrl + '/connect/introspect';

1 Ответ

1 голос
/ 18 апреля 2019

Вы перепутали два разных подхода: зарегистрировали "gekoo.webSPA" клиента с "GrantTypes.Implicit" в IdSrv (и Angular), но также создали другое (ASP.NET MVC) клиентское приложение с тем же именем, но ResponseType = "code id_token". Таким образом, ваше приложение Angular вызывает проблему, но ответ обрабатывается серверной частью ASP.Net, что приводит к сбою. На самом деле вы можете разместить свой Angular вообще без MVC или использовать этот QA в качестве эталона.

...