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
определить, с какого субдомена пришел пользователь.