2011-02-18 48 views
18

我正在構建一個應用程序,其中的要求似乎是標準問題(至少對我來說)...我有一個基於asp.net.net mvc &客戶端的Web.UI iphone,andriod & blackberry。.net服務架構中的n層身份和授權

因此,明智的做法是將我所有的業務邏輯轉移到可以通過http訪問的服務層。這個服務層必須接受具有用戶上下文(身份)的請求,並且以一種很好的方式執行授權,無論哪種類型的客戶端與它通信(我希望?)。

過去的一年,我去了一個3個月的演出,那個演員使用了W.I.F. (Windows身份基礎)的混合內部部署&雲架構。我喜歡它。 (1)外部化認證,而不是關心它是如何完成的,(2)從業務邏輯中移除授權邏輯,(3)基於權利要求的授權。

在過去的一年裏,我聽過並關注Rest Services提供的'嶄新酷酷的嬉皮士做事方式'。所以我很好,讓我們試試看。在我開始玩&獲得編碼後,我開始變得非常困惑(並且隨後在不寫另一行c#的情況下,昨天讀了大約10個小時)。我仍然對所有SOAP vs REST,WS。* vs vs Http,SAML vs SWT babble感到困惑。我真的不希望這個線程是關於這個的,因爲有足夠的這個在stackoverflow上說,但我覺得我有兩個陣營之間的選擇,當它不真的覺得我想要一個或另一個但從每個位?

對我來說,我上面提到的關於WIF的3點看起來不像是應該與WS綁定的概念。但是我感覺他們,或者至少現在WIF如何在沒有專家調整的情況下(例如,我偶然發現這篇文章是在幾天​​前寫的 - http://zamd.net/2011/02/08/using-simple-web-token-swt-with-wif/)。

我不太瞭解的其他領域是我的客戶端(iphone,andriod,blackberry)能夠使用WIF進行播放,它是否是向他們拋出SAML令牌的STS,它們的行爲就像瀏覽器並像其他客戶端一樣將其傳回標題中?是的,我必須要知道,但是如果這是與W.I.F的交易斷路器,並且在發佈之後我會直截了當地發現,那麼至少我可以專注於此。

最後再投入一件東西。我真的不想去想這些。我想使用第三方身份驗證/身份提供商 - 我相信使用OpenID的http://www.janrain.com/products/engage。這可以融入W.I.F.或者我只是從OpenID創建一個新的SAML令牌,並從那時起使用WIF。

我想在這個喋喋不休的結尾,我想回到我開始的地方,因爲越來越複雜,我提出的問題越多,考慮的選擇越多。

是否有一個服務層(在WCF上)與不同的非.NET客戶端進行通信,這需要身份上下文和授權如此奇怪?如果你已經建立了這樣的東西,你是如何接近它的?

回答

2

當你有很多設備時,一種解決所有問題的方法是找到最小公分母。

假設您的所有客戶都支持cookies。這樣做的一種方法是:

  • 有一個基於cookie的身份驗證系統。
  • 緩存在服務器端的所有授權信息,鏈接到一個會話或鑰匙在cookie
  • 對於每個請求檢查授權

不太一樣優雅與使用SAML令牌,但它的工作橫平臺/設備。

IPhone支持Cookie http://support.apple.com/kb/HT1675

黑莓支持Cookie http://docs.blackberry.com/en/developers/deliverables/11844/feature_cookie_storage_438273_11.jsp

+0

一個SAML令牌只是嵌入在cookie中的格式....就算他們能得到非常大的,但如果它的設計沒有吹出來的,我不明白爲什麼一個SAML令牌不能使用跨平臺。 – 2011-02-18 18:23:11

+0

爲了澄清這一點,我不太在乎客戶端的授權和使用SAML,我更關心它在服務層。我需要知道的是客戶端可以像瀏覽器一樣攜帶令牌。換句話說,我可以假設你在回覆中說'假設'。 – 2011-02-18 18:26:54

+0

我不認爲iphone應用程序是一樣的使用Safari瀏覽器在iphone上?我想你想用的是這個,也許 - http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/iPhoneCoreData01/Introduction/Introduction.html ...無論如何,我想知道如果任何人實際上在更大的圖片上有一個裂縫。 – 2011-02-18 18:47:42

0

由於WIF會談WS-信託/引擎蓋下WS-聯邦,你可以在服務層暴露基於聲明的身份。

本文介紹如何創建一個WCF STS,它將與使用這些協議的外部客戶端通信。 http://msdn.microsoft.com/en-us/library/ee748498.aspx

從服務層的授權角度來看,您可以使用自定義授權管理器來檢查是否已提交聲明。 http://msdn.microsoft.com/en-us/library/ms731774.aspx

插上外部身份服務,如OpenID和添加自己的債權分爲由WIF生成的,那麼你可以從ClaimsAuthenticationManager子類,如下所示:

public class MyClaimsAuthenticationManager : ClaimsAuthenticationManager {

public override IClaimsPrincipal Authenticate(string resourceName, IClaimsPrincipal incomingPrincipal) 
    { 
     if (!incomingPrincipal.Identity.IsAuthenticated) 
     { 
      return incomingPrincipal; 
     } 

     //TODO: obtain user profile claims from external source, i.e. database, web service    
     // below code demonstrates how to custom claims to the current principal 
     // (which are then persisted for the lifecycle of the user's browser session)    

     IClaimsIdentity identity = (IClaimsIdentity)incomingPrincipal.Identity; 

     identity.Claims.Add(new Claim(ClaimTypes.Email, "[email protected]")); 

     return incomingPrincipal; 
    } 
} 

你需要通過設置claimsAuthenticationManager配置參數告訴WIF在Web.config文件中使用您自己的聲明管理器。

希望這會有所幫助。

1

我要帶一條縫稍微回答你的問題更抽象...

在我開始之前,我的背景是MS偏見因此有可能是相同的(或更好)從其他來源獲得的選項。

兩個引用,我發現非常有用:

1)指導基於聲明的標識和訪問控制

http://msdn.microsoft.com/en-us/library/ff423674.aspx

2)編程Windows標識基礎

作者:維托裏奧Bertocci 提供kindle格式的複印件

T這裏有很多其他來源,但這兩個涵蓋了幾個場景,併爲任何想要加快出發點的人提供良好的背景信息。

我鼓勵其他海報來填補任何空白或瑕疵:) 我對一些技術細節進行了修飾,以專注於所問的問題。

我打破聯合身份向下的方式是,大致如下:

  1. 應用(一個或多個)應用程序(S)]
  2. 認證服務(一個或多個)[STS(S)]
  3. 權利要求集(s)實施如權利要求(一個或多個)]
  4. 信任關係(一個或多個)[信託(S)]
  5. 運輸方法(s)實施傳輸(S)]

STS負責驗證用戶的身份併爲某些聲明提供擔保。它通過提供(1)包含聲明的簽名blob或(2)第三方可以用來查找聲明的唯一標識符來實現此目的。

想要向用戶提供服務的應用程序可以「信任」STS以向其提供可用於與用戶適當協作的聲明,從而使其有責任驗證用戶(除其他外如維護集中式元數據,但我離題了)。

STS還有能力「信任」另一個STS,基本上說「如果你說這個人是Joe Smith,他們有X,Y和Z角色,那麼我會爲你說的話保證! 「

所以套用:

應用(一個或多個) 「信任」 的STS {這又可以 「信任」 另一個STS},以提供它/它們權利要求(一個或多個)

**切換齒輪* *

SOAP VS REST

在一天SOAP和REST的結束都是服務類型,讓我們稱之爲索賠的消費者。他們都希望有人給他們一個充滿聲望的桶,以便他們能夠完成工作併發回一些東西。 此外,這兩種服務類型都可以通過使用令牌(假設服務可以處理一些URL重寫)或通過頭(HTTP for REST和SOAP for SOAP服務)通過查詢字符串來呈現。無論哪種方式,目標是相同的:將聲明或UID傳輸到應用程序。

WS * VS HTTP

這些(與TCP/IP,SSL,祕密解碼器環等)將被傳遞的信息來回,儘管有不同程度的確定性,有人在中間罐的方法」找到一種模仿用戶的方式。

SAML VS SWT

這些(連同基64編碼,XML,簡單文本,等)是串行化的權利要求這兩種方法。這兩個恰好符合其他標準,所以每個人都可以說相同的語言。

**再回到點**

每個這樣的技術組合是有效的(根據不同的應用,有些是不太安全的,別人更容易實現,其他人較低水平的設備,等效果更好),並且只是一個人與另一個人做工作的方式。

所以,如果我有一個。已經在SAML fomat中爲WS *管道提供了一組聲明的Net應用程序的最終結果是該應用程序具有[SAML中的聲明]。

通過一些處理,這些可以轉換成[SWT中的聲明]。

然後可以將新聲明打包並通過HTTP/SSL發送到Java應用程序。

如果Java應用程序「信任」相同的STS(或「信任」.Net應用程序STS的STS),則會打開索賠並執行其工作。

  • 專家調整你提到有發生,問題僅僅是由誰和如何TRANSPARANT是

    1. 戴夫提供的一種方式完全有效的例子來實現自定義代碼的調整。
    2. ADFS提供翻譯規則,嘗試通過配置完成合並和翻譯。
  • 其在不同平臺/設備/應用服務的想法的/ etc也不奇怪可言,這正是所有這些東西是被建立在解決

我是那種情景在嘗試構建類似於你所問的內容的過程中,我自己也一直在研究同樣的問題。

您提到的Engage服務允許您將應用程序的用戶與外部來源相關聯,並可用於驗證這些用戶的身份... ala「我看到您通過Google驗證身份爲[email protected],我知道您是約翰沃克的身份證號碼是4321,哦,看,你把你最喜歡的顏色設置改爲藍色......繼續!「

它沒有做的是爲您的應用程序提供特定於您的應用程序的聲明(除非您需要知道的所有聲明來自Google數據,在這種情況下,您可能會構建混搭而不是LOB應用程序...

另一種情形:

  1. 用戶進入你的應用程序
  2. 被重定向到谷歌
  3. 被重定向到STS返回到您的STS
  4. 電子郵件和喜歡的顏色的權利要求(每個谷歌)
  5. 名單角色和限購要求的添加(從您的應用程序特定數據存儲)
  6. 用戶返回到應用
  7. 添加
  8. 用戶嘗試購買$ 10,000個紫色的小部件,你說「好了,你只能買信用$ 5,000和你...你確定你想要紫色聽說你喜歡藍色的?」

,我會直接另一個地方你是微軟提供的AppFabric訪問控制服務。 (http://msdn.microsoft.com/en-us/library/ee732536。ASPX) 聲明:我沒有用它尚未但是,它看起來像它的種,你正在尋找大量的隱藏離開你肉的翻譯。

0

我已接近使用彈簧+ java的一個類似的問題;它需要的所有概念都在.net中,所以我在這裏提到它。我發現spring-security提出的解決方案效果很好(針對我的簡單授權要求)。在我的服務層,這需要特定的權限的方法通過註解(無論是在界面或實現)聲明此:

@Secured(MyPermissions.READ, MyPermissions.WRITE) 
void modifyPerson(PersonChanges changes); 

@Secured(MyPermissions.READ) 
Person readPerson(); 

在這個例子中安全框架(彈簧)包裝用動態代理服務實現這驗證我的授權層是否已將適當的線程作用域角色/權限放入評估服務方法的上下文中,如果不是則引發安全異常。

我還發現它有助於集團需要通過URL模式的權限,一起服務,使「需要一個認證委託人」要求在最高級別進行處理:例如myapp/services/secure/personService - 如果沒有認證信息存在,任何需要*/secure的URL模式將重定向到認證頁面。

即使頂級HTTP攔截器設置完成錯誤(例如無法驗證/創建身份驗證會話),只要動態代理服務器正在運行,什麼是真正好(我雖然)要求線程作用域憑據在那裏工作是無法執行業務邏輯的。

而且,它的作品真的很好的聚合服務 - 如果一個服務調用另一個,較低級別的授權規則,仍會強制實施,如果他們沒有適當的組合服務聲明。