2011-09-21 58 views
2

我們正在建立在以下幾個時尚網站:添加WIF STS服務於現有項目

Site1.Web - ASP.NET Web項目(.NET 4.0,Web窗體) Common.Core - 類庫項目(所有數據庫交互)

當所有站點共享Common.Core項目時,Web項目爲每個站點出現一次。我們在Web項目中有一個登錄表單,爲了進行身份驗證,調用類庫。這將取消類似的代碼下面:

Common.Core.Authenticate auth = new Common.Core.Authenticate(conStr); 
bool validLogin = auth.ValidateUser(userName, password); 
if(validLogin) 
{ 
    Common.Core.User = auth.GetCurrentUser(); 
} 

的高層在推動中間層服務/應用層和想使用一個更優雅的解決方案來處理單點登錄。因此,決定使用WIF服務來處理登錄和驗證。此外,我們希望儘量減少每個Web項目中必須更改的代碼,即儘量在Common.Core中儘可能多地進行更改。

我看過幾個示例,展示如何將STS引用添加到Web項目。這可以在用戶驗證沒有考慮到像Core.Common這樣的其他項目中的情況下很好地工作。但是,在我們的場景中,我們如何處理驗證,同時還要經歷通用類庫?

理想情況下,我想添加一個STS引用到Core.Common類庫,並用一個STS服務的調用替換直接數據庫邏輯(auth.ValidateUser上面)。但是,甚至有可能這樣做?請求是否必須在Web項目中啓動?如果是這樣,兩個地方都需要STS參考嗎?

其遵循相同的Web項目的任何教程或資源 - >類庫 - > STS服務路徑將不勝感激。

回答

1

我也:-)

推薦使用WIF在基於場景索賠的認證過程是「逆轉」。你的應用不會給任何人打電話,它會收到來自信任源(STS)的所需信息。

「STS參考」不是庫參考。這是您的應用程序和安全令牌的可信來源之間的邏輯連接。令牌是您的應用用來決定如何處理用戶請求的工件。

我同意@nzpcmad,它很可能可以完全刪除對您的Common.Core庫的調用。看看你還能用它做些什麼可能是有用的。對象給你帶來什麼Common.Core.User

如果是用戶的只是屬性(如姓名,電子郵件,角色等),它很可能,你可以只創建一個新的版本,僅包裝的IPrincipal BYT WIF提供( ClaimsPrincipal)。

例如(約沒有錯誤處理,僞代碼):

public User CurrentUser() 
{ 
    var user = new User(); 
    var cu = HttpContext.Current.User as IClaimsPrincipal; 
    user.Name = cu.Name; 
    user.eMail = (cu.Identity as IClaimsIdentity).Claims.First(c=> c.ClaimType = "eMail").Value; 
    return user; 
} 

由於@nzpcmad說,你可以使用ADFS或其他一些STS。你的應用程序不會在意。

+0

感謝您的信息。我一直在使用的示例應用程序在asp.net網站和STS網站/服務之間建立了可信連接,沒有中間層類庫(Common.Core)。 Common.Core.User類包含存儲在數據庫中的基本信息,類似於上面的示例。一個新的User類可以很容易地從IClaimsPrincipal派生。 只是爲了確認,對於這些現有的網站,我們將不得不在Web應用程序(不是Common.Core)中建立STS連接,我們必須重構/重寫一些GetCurrentUser()邏輯以從IClaimsPrincipal? – user957802

+0

WIF爲你做所有的工作。在某種程度上,WIF是「中間層」(實際上是HTTPModule)。所以,是的。在高水平,這是你會做的。請注意,您仍然可以讓Common.Core.User將有關用戶的數據從數據庫中提取出來。這些將是非STS提供的附加信息。在這種情況下,您需要使用一些句柄來關聯數據(例如電子郵件,UID等) –

1

實現此目的的一種方法是將ADO的實例FedUtil ASP.NET項目。實質上,身份驗證現在是「外包」,您可以簡單地從應用程序中刪除對核心庫的調用。然後設置ADFS以返回程序需要授權的任何屬性。您可能需要將這些聲明屬性轉換爲在後續調用中傳回給公用內核的任何屬性。

或者你可以讓共同核心「聲稱知道」在這個意義上,它現在承認「索賠屬性」,而不是「共同核心」的屬性。這涉及使用不同的.NET類 - 不需要ADFS連接。

字警告 - 您的驗證似乎所有的數據庫有關。 ADFS無法對數據庫進行身份驗證。它只能在安裝了ADFS的域(或AD之間的信任關係中的其他AD)中對AD的實例進行身份驗證。

如果你想對你的需要自定義STS,然後與ADFS聯合一個數據庫進行身份驗證。在這裏看到:Identity Server.

+0

感謝您的快速回復。 ADFS不會成爲這些網站的選擇,但聲明意識到STS服務/網站會。我認爲STS信任必須建立在web項目(而不是Common.Core類庫)上,因爲這正是使用該服務的原因。那是對的嗎? – user957802