2008-09-16 71 views
9

可以說你有網站www.xyz.com和www.abc.com。你如何通過應用域之間的認證會話

可以說用戶訪問www.abc.com,他們通過普通的ASP .NET會員提供商進行身份驗證。

然後,從該網站,他們被髮送到(重定向,鏈接,任何作品)網站www.xyz.com,並且www.abc.com網站的目的是將該用戶傳遞給另一個網站,作爲isAuthenticated的狀態,以便該網站www.xyz.com不再要求所述用戶的憑證。

這需要什麼工作?我對此有一些限制,但用戶數據庫是完全獨立的,它不是組織內部的,就所有方面而言,它就像從stackoverflow.com傳遞到Google身份驗證一樣,它本質上就是單獨的。到相關文章的鏈接就足夠了。

回答

5

嘗試使用FormAuthentication通過設置web.config中的身份驗證部分,像這樣:

<authentication mode="Forms"> 
    <forms name=".ASPXAUTH" requireSSL="true" 
     protection="All" 
     enableCrossAppRedirects="true" /> 
</authentication> 

生成計算機密鑰。示例:Easiest way to generate MachineKey – Tips and tricks: ASP.NET, IIS ...

發送到其他應用程序時,身份驗證票證作爲隱藏字段傳遞。在閱讀第一個應用程序的帖子時,第二個應用程序將讀取加密票證並驗證用戶身份。以下是通過頁面的一個例子帖子領域:

的.aspx:

<form id="form1" runat="server"> 
    <div> 
    <p><asp:Button ID="btnTransfer" runat="server" Text="Go" PostBackUrl="http://otherapp/" /></p> 
    <input id="hdnStreetCred" runat="server" type="hidden" /> 
    </div> 
</form> 

後臺代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    FormsIdentity cIdentity = Page.User.Identity as FormsIdentity; 
    if (cIdentity != null) 
    { 
     this.hdnStreetCred.ID = FormsAuthentication.FormsCookieName; 
     this.hdnStreetCred.Value = FormsAuthentication.Encrypt(((FormsIdentity)User.Identity).Ticket); 
    } 
} 

另見交叉應用形式的認證部分中的第5章來自Wrox的這個book。除了提供自制SSO解決方案之外,它還推薦類似上面的答案。

+0

您是否需要在`http:// otherapp /`側寫入任何代碼,或者ASP.NET「只知道」包含FormsCookieName的POST表單? – russau 2011-08-16 22:51:51

0

不知道你會用什麼.NET,但通常我會在LAMP堆棧中使用memcached

0

分辨率取決於應用程序的類型和運行環境。例如。在使用NT域的Intranet上,您可以使用NTLM將Windows憑據直接傳遞到Intranet外圍的服務器,而無需重複會話。

該方法如何執行此操作通常命名爲單一登錄(請參閱Wikipedia)。

1

如果您將用戶會話存儲在數據庫中,您可以簡單地檢查會話表中Guid的存在(如果存在),則用戶已經在其他域中進行了身份驗證。爲此,當您將用戶重定向到其他網站時,您必須在URL中包含會話guid。

2

如果您正在使用內置成員資格系統,則可以在每個web.config中使用類似於此的一些方法,通過表單身份驗證進行跨子域身份驗證。

<authentication mode="Forms"> 
    <forms name=".ASPXAUTH" loginUrl="~/Login.aspx" path="/" 
        protection="All" 
        domain="datasharp.co.uk" 
        enableCrossAppRedirects="true" /> 

</authentication> 

請確保名稱,路徑,保護和域在所有web.configs中都是相同的。如果站點位於不同的機器上,則還需要確保machineKey和驗證和加密密鑰相同。

0

有多種解決此問題的方法,稱爲「跨域單點登錄」。維基百科的文章指出,由馬捷是特別有用的,如果你正在尋找一個開源的解決方案 - 但是 - 在Windows環境下我相信你最好帶2的一個方法:

  1. 購買商業SSO產品(如SiteMinder或PingIdentity)
  2. 使用MicroSoft的跨域SSO解決方案,名爲ADFS - Active Direcctory Federation Services。 (聯邦是用於協調多個域的行爲的術語)

我已經使用了SiteMinder,它運行良好,但它很昂貴。如果你在所有MicroSoft環境中,我認爲ADFS是你最好的選擇。從ADFS whitepaper開始。

-1

或者,如果您想自行推出並且所涉及的站點不在同一臺服務器上或無法訪問共享數據庫(在這種情況下請參閱上述響應),則可以在每個站點上放置一個web beacon這些網站會引用其他網站。

在網站A上放置一個單一像素圖像(網站信標),它將通過用戶ID(加密的&時間戳)呼叫網站B.然後,這將在B站點爲用戶創建一個新的用戶會話,該用戶將被設置爲登錄。然後當用戶訪問站點B時,他們已經登錄。

爲了最小化呼叫,您只能將Web信標在主頁上或者登錄確認頁面。過去我成功地使用它來在合作伙伴網站之間傳遞信息。

+0

這聽起來無限可恨。 – 2008-09-16 14:51:52