Мое приложение состоит из 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, и это работает, поэтому, похоже, это связано с угловой интеграцией.
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';