2017-01-25 2 views
1

При использовании любого из стандартных поставщиков удостоверений (Google, Facebook) после входа в систему и согласия они перенаправляются на мой основной сервер идентификации и позволяют перенаправлять его на неявный клиент, зарегистрированный в пределах Это. Как я могу достичь такого же поведения с другим сервером удостоверений, выступающим в роли внешнего поставщика удостоверений?IdentityServer, используемый в качестве внешнего поставщика удостоверений для другого IdentityServer, не может правильно перенаправить

Моя архитектура безопасности состоит из двух серверов идентификации, первичных (v3), с использованием другого (v4) в качестве внешнего поставщика удостоверений. Неявный клиент открывает всплывающее окно с первичным IdentityServer.

У меня есть проблемы с следующим потоком:

Diagram showing authentication flow

Сервер идентификации действует как внешний 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.

+1

Похоже, вы перенаправляетесь обратно в клиентское приложение JavaScript вместо перенаправления на основной сервер идентификации. Это упоминается в политике безопасности содержимого, которая позволяет поставщику внешних удостоверений размещать только первичный поставщик удостоверений, поскольку, возможно, он был отправлен URL-адрес перенаправления на URL-адрес перенаправления клиента, который мог быть проблемой. HTH – Saravanan

+0

Да, я пришел к такому же выводу. Но я не понимаю, почему это происходит. Поскольку оба IdentityServers имеют только URL-адрес первичного, добавленного как действительный redirect_url. Я бы ожидал, что они будут обмениваться запросами между собой и пусть первичный перенаправляет на мой неявный js-клиент. Я ожидал, что поведение будет больше соответствовать тому, как это делают Google или Facebook. Вы регистрируете свой IdentityServer там, перенаправляете URL-адреса и получаете идентификатор и ключ клиента :) – xmichaelx

+0

Есть образец где-то из idsvr, выступающего в качестве внешнего провайдера другого idsvr? ти –

ответ

2

Я начал искать «хром» и «СНТ» ключевые слова в вопросах IdentityServer4 и нашел это: https://github.com/IdentityServer/IdentityServer4/issues/659

Оказывается, что форма-действия ПСУ на ответ Авторизоваться необходимо изменить и версии IdentityServer4 от 1,0 .1 эта директива политики смягчена.

Я обновил IdentityServer4 с 1.0.0 до 1.0.2, и он решил проблему.

Смежные вопросы