При использовании любого из стандартных поставщиков удостоверений (Google, Facebook) после входа в систему и согласия они перенаправляются на мой основной сервер идентификации и позволяют перенаправлять его на неявный клиент, зарегистрированный в пределах Это. Как я могу достичь такого же поведения с другим сервером удостоверений, выступающим в роли внешнего поставщика удостоверений?IdentityServer, используемый в качестве внешнего поставщика удостоверений для другого IdentityServer, не может правильно перенаправить
Моя архитектура безопасности состоит из двух серверов идентификации, первичных (v3), с использованием другого (v4) в качестве внешнего поставщика удостоверений. Неявный клиент открывает всплывающее окно с первичным IdentityServer.
У меня есть проблемы с следующим потоком:
Сервер идентификации действует как внешний IdP застревает на конечной точке:
/connect/authorize/login?client_id=primaryIdentityServer&redirect_uri=https://primaryIdentityServer.example.com/signin-oidc&response_mode=form_post&response_type=code id_token&scope=openid profile email
с сообщением об ошибке:
Refused to send form data to 'https://jsclient.example.com/#(...)' because it violates the following Content Security Policy directive: "form-action https://primaryIdentityServer.example.com".
Первичная конфигурация IdentityServer для внешнего поставщика идентичности:
var opts = new OpenIdConnectAuthenticationOptions {
ClientId = "primaryServer",
ClientSecret = "secret",
RedirectUri = "https://primaryIdentityServer.example.com/signin-oidc",
Authority = "https://externalIdPIdentityServer.example.com",
ResponseType = "code id_token",
Scope = "openid profile email",
SignInAsAuthenticationType = signInAsType
};
app.UseOpenIdConnectAuthentication(opts);
IdentityServer первичного зарегистрирован в IdentityServer, выступающий в качестве внешнего IdP:
new Client
{
ClientId = "primaryServer",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
RedirectUris = new List<string>
{
"https://primaryIdentityServer.example.com/signin-oidc"
},
ClientSecrets =
{
new Secret("secret".Sha256())
},
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email
},
AlwaysIncludeUserClaimsInIdToken = true
}
EDIT: я заметил, когда я пытаюсь проверить свои разрешения для приложений на /permissions
Конечная точка и аутентификация с использованием внешнего IdentityServer. Я перенаправлен на конечную точку разрешения без каких-либо проблем.
EDIT: Я попытался переключиться на неявный поток между серверами удостоверений. Удаленные секреты, code
из response_type и установить неявный как разрешенный тип гранта, и я по-прежнему получаю ту же ошибку с отправкой данных post моему клиенту js, поэтому кажется, что выбранный поток (гибридный или неявный) не имеет значения для этой проблемы.
EDIT: Я проверил источник конечной точки, на которой процесс аутентификации застрял:
<form method='post' action='https://primaryIdentityServer.example.com/signin-oidc'><input type='hidden' name='id_token' value='{token}' />
<input type='hidden' name='access_token' value='{token}' />
<input type='hidden' name='token_type' value='Bearer' />
<input type='hidden' name='expires_in' value='3600' />
<input type='hidden' name='scope' value='openid profile' />
<input type='hidden' name='state' value='OpenIdConnect.AuthenticationProperties={props}' />
<input type='hidden' name='session_state' value='{state}' />
</form><script>(function(){document.forms[0].submit();})();</script>
с параметрами запроса: https://externalIdPIdentityServer.example.com/connect/authorize/consent?client_id=primaryServer&redirect_uri=https://primaryIdentityServer.example.com/signin-oidc&response_mode=form_post&response_type=token id_token&scope=openid profile&state={state}&nonce={nonce}
поэтому его довольно странно, почему ошибка:
Refused to send form data to 'https://jsclient.example.com/#(...)' because it violates the following Content Security Policy directive: "form-action https://primaryIdentityServer.example.com".
sinc e jsclient.example.com нигде не упоминается.
EDIT: Проблема возникает только в Chrome, а не в Firefox или IE Edge.
Похоже, вы перенаправляетесь обратно в клиентское приложение JavaScript вместо перенаправления на основной сервер идентификации. Это упоминается в политике безопасности содержимого, которая позволяет поставщику внешних удостоверений размещать только первичный поставщик удостоверений, поскольку, возможно, он был отправлен URL-адрес перенаправления на URL-адрес перенаправления клиента, который мог быть проблемой. HTH – Saravanan
Да, я пришел к такому же выводу. Но я не понимаю, почему это происходит. Поскольку оба IdentityServers имеют только URL-адрес первичного, добавленного как действительный redirect_url. Я бы ожидал, что они будут обмениваться запросами между собой и пусть первичный перенаправляет на мой неявный js-клиент. Я ожидал, что поведение будет больше соответствовать тому, как это делают Google или Facebook. Вы регистрируете свой IdentityServer там, перенаправляете URL-адреса и получаете идентификатор и ключ клиента :) – xmichaelx
Есть образец где-то из idsvr, выступающего в качестве внешнего провайдера другого idsvr? ти –