WIF и поддоменов

У нас есть существующее приложение ASP.NET (WebForms), которое использует домашнюю аутентификацию. Нам было поручено внедрить решение с единым входом, и мы решили использовать WIF.

У нас запущен один экземпляр приложения, и мы идентифицируем клиента с помощью субдомена (например, client1.ourapp.com, client2.ourapp.com и т. Д.). В коде приложения мы удаляем первый поддомен, который идентифицирует клиента.

Мы работали с проверкой концепции WIF, чтобы выяснить, как перенаправить пользователя обратно на правильный поддомен после проверки подлинности. Поведение "из коробки", по-видимому, заключается в том, что STS перенаправляет пользователя в любую область, указанную в файле конфигурации. Ниже приведен файл конфигурации PoC. Я использую файл hosts для фальсификации разных клиентов (например, 127.0.0.1 client1.ourapp.com, 127.0.0.1 client2.ourapp.com).

<federatedAuthentication>
    <wsFederation 
        passiveRedirectEnabled="true" 
        issuer="http://ourapp.com/SSOPOCSite_STS/" 
        realm="http://client1.ourapp.com" 
        requireHttps="false" />
</federatedAuthentication>

Очевидно, что это не сработает, потому что мы не можем перенаправить всех на один и тот же поддомен.

Мы думаем, что мы выяснили, как справиться с этим, но хотели бы получить некоторые сторонние мнения о том, правильно ли мы поступаем или нам просто повезло.

Мы создали обработчик события для события FAM RedirectingToIdentityProvider. В нем мы получаем название компании из URL-адреса запроса, строим строку области, используя имя компании, устанавливаем Realm и HomeRealm для SignInRequestMessage, а затем позволяем FAM делать свое дело (т. Е. Перенаправлять нас на STS для аутентификации).

protected void WSFederationAuthenticationModule_RedirectingToIdentityProvider( object sender, RedirectingToIdentityProviderEventArgs e )
{
    // this method parses the HTTP_HOST and gets the first subdomain
    var companyName = GetCompanyName();
    var realm = GetRealm( companyName );

    e.SignInRequestMessage.Realm = realm;
    e.SignInRequestMessage.HomeRealm = companyName;
}

string GetRealm( string companyName )
{
    return String.Format( "http://{0}.ourapp.com/SSOPOCSite/", companyName );
}

Кажется ли это разумным решением проблемы?

Есть ли какие-либо проблемы, которые могут возникнуть в результате?

Есть ли лучший подход?

1 ответ

Решение

Ваше решение звучит хорошо (явно передавая нужную информацию), единственное другое решение, которое приходит на ум, - это использование Request.UrlReferrer определить, с какого субдомена пришел пользователь.

Другие вопросы по тегам