2012-04-25 98 views
3

我們有一個使用本土認證的現有ASP.NET應用程序(WebForms)。我們一直負責實施單點登錄解決方案,並選擇使用WIF。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的Realm和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); 
} 

這是否看起來像是一個合理的解決方案?

我們可能會遇到任何問題嗎?

有沒有更好的方法?

回答

1

你的解決方案聽起來不錯(明確地傳遞你需要的信息),唯一想到的其他解決方案是使用Request.UrlReferrer來確定用戶來自哪個子域。