我们有一个现有的ASP.NET应用程序(WebForms),它使用自行开发的身份验证。我们被指定实施单点登录解决方案,并选择使用WIF。
我们只有一个运行的应用程序实例,我们通过使用子域(例如client1.ourapp.com,client2.ourapp.com等)来识别客户端。在应用程序代码中,我们去掉第一个子域名以识别客户端。
我们一直在使用WIF概念证明来确定如何在用户经过身份验证后将其重定向回正确的子域。默认情况下,STS会将用户重定向到配置文件中标识的任何领域。以下是概念证明配置文件的内容。我正在使用我的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中获取公司名称,使用公司名称构建一个领域字符串,设置SignInRequestMessage的领域和HomeRealm,然后让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 );
}
这个方案是否看起来是解决问题的合理方案?
我们可能会遇到什么问题吗?
有更好的方法吗?