Как мне получить аутентификацию двух веб-сайтов на сервере Thinktecture Identity Server?

После просмотра видеороликов PluralSite по Identity and Access Control и настройки всего, что мне нужно (у меня есть работающий локальный экземпляр Thinktecture Identity Server на моей машине, а также расширение Identity and Access vs2012), я не могу получить два веб-приложения в одном решении для аутентификации на Identity Server.

В настоящее время они оба требуют, чтобы я вошел в сервер идентификаторов, а это не то, чего я хочу, я хочу иметь возможность один раз войти на сервер идентификаторов и пройти аутентификацию для обоих сайтов.

Вот части web.config, которые, я ДУМАЮ, определяют, как это должно происходить:

Какова именно роль области? Должен ли это быть настоящий URL-адрес или его можно рассматривать как пространство имен? Я предполагаю, что при попытке использовать один и тот же токен безопасности, выданный Id Server, на нескольких сайтах должна вступить в игру область визуализации.

<system.identityModel.services>
<federationConfiguration>
<cookieHandler requireSsl="false" />
<wsFederation passiveRedirectEnabled="true" issuer="https://MyIdServer.com/idsvr/issue/wsfed" realm="http://MyLocalServerRunningIISExpress:55495/" reply="http://MyLocalServerRunningIISExpress:55495/" requireHttps="false" />
</federationConfiguration>
</system.identityModel.services>

Как работает AudienceUris? Я предполагаю, что если я хочу, чтобы один токен безопасности использовался на нескольких сайтах, мне нужно, чтобы URL-адрес каждого сайта был представлен в разделе AudienceUris?

<system.identityModel>
<identityConfiguration>
<claimsAuthenticationManager type="SSO.Security.ClaimsAuthenticationManager, SSO.Security" />      
<audienceUris>
<add value="http://MyLocalServerRunningIISExpress:55495/" />
<add value="http://MyLocalServerRunningIISExpress:53133/" />
</audienceUris>
</identityConfiguration>
</system.identityModel>

Другой файл web.config для второго сайта аналогичен приведенным выше разделам, но с измененными номерами портов в URL-адресах.

Опять же, у меня ДЕЙСТВИТЕЛЬНО есть Id Srv, возвращающий мне токен, который аутентифицирует меня для ОДНОГО сайта, но я не могу заставить его работать для двух.

Я предполагаю, что это проблема конфигурации или, может быть, тот факт, что я запускаю два экземпляра IIS Express с двумя номерами портов вместо того, чтобы использовать реальный сервер IIS и вместо этого использовать URL-адрес?


person Michael McCarthy    schedule 29.04.2013    source источник


Ответы (4)


Вы пробовали FederatedSignOut?

WSFederationAuthenticationModule am = FederatedAuthentication.WSFederationAuthenticationModule;
WSFederationAuthenticationModule.FederatedSignOut(new Uri(am.Issuer), new Uri(am.Realm));

Я знаю, что это WIF 1.0, но в WIF 4.5 должно быть что-то подобное.

person rbrayb    schedule 29.04.2013

nzpcmad, вот что похоже в 4.5:

var authModule = FederatedAuthentication.WSFederationAuthenticationModule;
authModule.SignOut(false);
var signOutRequestMessage = new SignOutRequestMessage(new Uri(authModule.Issuer), authModule.Realm);
var queryString = signOutRequestMessage.WriteQueryString();
return new RedirectResult(queryString);

Я ДУМАЮ, что проблема здесь как-то связана с тем, как Thinktecture Id Svr выдает файл cookie, который должен отслеживать, какие проверяющие стороны аутентифицируются. По какой-то причине файл cookie, содержащий аутентифицированные RP, похоже, не выдается до тех пор, пока не будет получен запрос на выход из системы, и я полагаю, что этот файл cookie должен быть выдан при получении запроса на вход?

У некоторых других людей была такая же проблема, и на GitHub для этого открыт билет: https://github.com/thinktecture/Thinktecture.IdentityServer.v2/issues/197

person Michael McCarthy    schedule 30.04.2013

Хорошо, по-видимому, вам нужно установить флажок «запомнить меня», чтобы файл cookie передавался на другой веб-сайт. Так что, по сути, это теперь работает. Чего я ВСЕ ЕЩЕ не могу сделать, так это правильно выйти из системы. Опять же, веб-сайт, который выходит из системы, очищает свой собственный файл cookie, а затем заботится о файле cookie STS, но другой веб-сайт остается в системе.

На странице выхода из сервера STS исходное представление имеет:

<iframe style="visibility: hidden; width: 1px; height: 1px" src="http://MyServer:55495/?wa=wsignoutcleanup1.0"></iframe>

Но поскольку в настоящее время авторизовано ДВА веб-сайта, я должен увидеть две из этих записей здесь, поэтому эта страница также может очистить этот файл cookie.

Вот мой код выхода:

var authModule = FederatedAuthentication.WSFederationAuthenticationModule;

//clear local cookie
authModule.SignOut(false);

//initiate federated sign out request to the STS
var signOutRequestMessage = new SignOutRequestMessage(new Uri(authModule.Issuer), authModule.Realm);
var queryString = signOutRequestMessage.WriteQueryString();
return new RedirectResult(queryString);

Я считаю, что этот код правильный, но я предполагаю, что проблема в том, что сервер STS не отслеживает, какие проверяющие стороны вошли в систему и должны уничтожить свои файлы cookie?

person Michael McCarthy    schedule 29.04.2013
comment
Одна проблема заключается в том, что файлы cookie для двух сайтов разные. Вам нужно указать имя файла cookie, которое будет использоваться, чтобы один и тот же файл cookie был общим. См. мой ответ. Это устраняет проблему единого входа и устраняет необходимость помнить меня, чтобы заставить его работать. - person awe; 21.06.2013

В обработчике cookie следует указать name, domain (и, возможно, path). Они должны быть одинаковыми на всех сайтах, использующих это.

<system.identityModel.services>
  <federationConfiguration>
    <cookieHandler requireSsl="false" 
       name="myCookieName" domain="MyLocalServerRunningIISExpress" path="/"/>
    <wsFederation passiveRedirectEnabled="true" requireHttps="false" 
       issuer="https://MyIdServer.com/idsvr/issue/wsfed" 
       realm="http://MyLocalServerRunningIISExpress:55495/" />
  </federationConfiguration>
</system.identityModel.services>

Я не уверен, как это работает с вашей настройкой, использующей разные номера портов. У меня стандартная установка IIS, и оба сайта работают как приложения в одном корне.

Еще одна настройка, которую я знаю, работает, заключается в том, чтобы настроить два сайта с общей последней частью домена. То есть сайты имеют URL: site1.mydomain.com и site2.mydomain.com. Затем параметр domain в <cookieHandler> устанавливается равным mydomain.com.

И да, все сайты должны быть перечислены в <audienceUris>, как в вашем примере.

Примечание.
Если URL-адрес reply идентичен realm, параметр reply не является строго обязательным.

person awe    schedule 21.06.2013