我们有一个使用本地身份验证的现有ASP.NET应用程序(WebForms)。我们的任务是实现单点登录解决方案,并选择使用WIF。
我们有一个正在运行的应用程序实例,并且我们使用子域(例如client1.ourapp.com、client2.ourapp.com等)来识别客户端。在应用程序代码中,我们剥离了第一个子域,并标识了客户端。
我们一直在使用WIF概念验证,以弄清楚如何在用户通过身份验证后将其重定向回正确的子域。开箱即用的行为似乎是STS将用户重定向到配置文件中标识的任何领域。以下是PoC配置文件。我使用我的主机文件来伪造不同的客户端(例如,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,然后让SignInRequestMessage完成它的工作(即,将我们重定向到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 );
}这看起来是一个合理的问题解决方案吗?
因此,我们可能会遇到什么问题吗?
有没有更好的方法?
发布于 2012-04-26 00:22:55
你的解决方案听起来不错(明确地传递你需要的信息),唯一想到的其他解决方案是使用Request.UrlReferrer来确定用户来自哪个子域。
https://stackoverflow.com/questions/10319597
复制相似问题