Размещение приложения ACS на нескольких хостах - PullRequest
1 голос
/ 20 января 2012

Я использую Windows Azure ACS для создания приложения единого входа.Я использую JavaScript / HTML для сбора информации от пользователя.Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно разместить свое приложение на разных хостах, например:

  • localhost
  • localhost: 81
  • *. Cloudapp.net
  • другой внутренний хост, такой как http://helloacs/

Я попытался создать несколько проверяющих приложений для каждого из этих хостов, но он работал только для localhost / localhost: 81.Мое приложение проверяющей стороны * .cloudapp.net настроено таким образом:

Name: *.cloudapp.net
Realm: *.cloudapp.net
Return URL: http://*.cloudapp.net/

Моя страница входа создает URL-адрес ответа так:

http://*.cloudapp.net/Login.aspx

Это мой сгенерированный вызов IdentityProviders.js:

https://*.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=wsfederation&realm=*.cloudapp.net&reply_to=http://*.cloudapp.net/Login.aspx&version=1.0&callback=ShowSigninPage

После перехода к провайдеру идентификации и входа в систему я получаю:

ACS30000: There was an error processing an OpenID sign-in response. 

Как мне заставить приложение работать на нескольких хостах, если это не решение?

Ответы [ 3 ]

3 голосов
/ 20 января 2012

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

  <microsoft.identityModel>
    <service>
     ..... 
     <audienceUris>
        <add value="http://localhost:4500/"/>
      </audienceUris>
      <federatedAuthentication>
        <wsFederation passiveRedirectEnabled="true" 
                      issuer="https://staykov.accesscontrol.windows.net/v2/wsfederation" 
                      realm="http://localhost:4500/"
                      requireHttps="false" />
        <cookieHandler requireSsl="false" />
      </federatedAuthentication>

Если вы хотите, чтобы одно и то же приложение запускалось одновременно под несколькими именами хостов, вам нужно добавить небольшую кодировку. Если вам нужно просто протестировать одно и то же приложение в другом домене - просто измените область в файле web.config на соответствующий адрес приложения проверяющей стороны. Вам необходимо изменить адрес в разделе " Audience Uris " и атрибут " realm " в элементе " wsFederation ". Если атрибут realm отличается от домена, в котором работает ваше приложение, проверка подлинности завершится неудачей.

Изучите этот и , который задает вопросы - и указывает на одну и ту же документацию и примеры того, как изменить область, если вы хотите обслуживать свое приложение в нескольких доменах. Я посмотрю на другие образцы.

И посмотрите здесь, как изменить область / обратный адрес /

1 голос
/ 06 марта 2013

Я столкнулся с подобной проблемой, как эта. У меня было два RP, один с использованием Windows Live Id и ADFS, а второй с использованием только ADFS. Оба RP указывают на один и тот же облачный сервис, поэтому, когда я перешел на https://orgB.myDomanin.com,, меня перенаправили на ACS, но я использовал область, указанную в web.config, что-то вроде:

https://name.accesscontrol.windows.net/v2/wsfederation?wa=sigin1.0&wtrealm=https%3a%2f%orgA.myDomain.com%2.... 

Если я изменил это вручную следующим образом:

https://name.accesscontrol.windows.net/v2/wsfederation?wa=sigin1.0&wtrealm=https%3a%2f%orgB.myDomain.com%2

Работает как надо.

Наконец-то я нашел решение в блоге Sandrino: http://fabriccontroller.net/blog/a-few-tips-to-get-up-and-running-with-theazure-appfabric-access-control-service, см. Раздел «Обновление своего мира». Если блог недоступен, я копирую код здесь, он должен быть внутри этого метода:

private void WSFederationAuthenticationModule_RedirectingToIdentityProvider(object sender, RedirectingToIdentityProviderEventArgs e)
{
    // Get the request url.
    var request = HttpContext.Current.Request;
    var requestUrl = request.Url;

    // Build the realm url.
    var realmUrl = new StringBuilder();
    realmUrl.Append(requestUrl.Scheme);
    realmUrl.Append("://");
    realmUrl.Append(request.Headers["Host"] ?? requestUrl.Authority);
    realmUrl.Append(request.ApplicationPath);
    if (!request.ApplicationPath.EndsWith("/"))
        realmUrl.Append("/");
    e.SignInRequestMessage.Realm = realmUrl.ToString();
}
1 голос
/ 03 декабря 2012

Поскольку сообщение в блоге находится в автономном режиме (и в течение некоторого времени), я опубликую еще один ответ здесь.

Чтобы настроить несколько reply_to адресов для проверяющей стороны ACS, необходимо использовать API.(Это невозможно сделать из веб-интерфейса).

Здесь приведен пример кода, который вы можете использовать: http://msdn.microsoft.com/en-us/library/windowsazure/hh135147.aspx#BKMK_5

Вы также можете использовать FluentACS ,что сделает это намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...