2014-09-13 52 views
0

什麼是IPrincipal/IIdentity優勢,而不是擁有包含您需要的屬性的自定義User類並將其用於認證/授權?將用戶存儲在IPrincipal/IIdentity中有什麼好處?

+0

它們是接口,你不在接口中「存儲用戶」。它們具有通常的接口優點,即與特定實現無關的合同。讓你的班級實施這些界面是否有用是有點令人懷疑的,但是不清楚這個問題。 – 2014-09-13 12:48:51

回答

3

顯而易見的好處如下:應用程序的身份驗證&授權的整體概念是圍繞以下方式構建的:主體和身份,表示爲IPrincipal/IIdentity。正因爲如此,內置機制通常假定使用這兩種機制。如果他們被使用,建立在機制可以工作。

以Web應用程序爲例。 HttpContext的終身用戶申請表示爲IPrincipal。通過符合這個約定,您允許授權機制正確地評估用戶是否被允許訪問網絡資源。這是因爲WebForms UrlAuthorization的模塊和MVC的Authorization屬性都假定主體以此標準方式存儲。

在桌面應用程序中,您有ThreadCurrentPrincipal這也是IPrincipal

更換IPrincipal/IIdentity與您自己的認證/授權接口將永遠。您將不得不重寫基本類庫的大部分處理認證/授權的部分,而不是內置在您要依靠自定義實現的接口中。

但是,我不完全明白你提出的兩個陳述之間的任何反對意見。您詢問了IPrincipal優於自定義課程的優勢。但是IPrincipal只是一個接口(!!),您的自定義類可以輕鬆實現。與IIdentity相同。然後,您可以將您的自定義課程放在任何地方IPrincipal預計。

當然,這可能有點棘手,例如在Web應用程序中,您將不得不替換內置的驗證模塊來設置IPrincipal。最常用的有兩種 - FormsAuthenticaiton,它使用GenericPrincipal/FormsIdentitySessionAuthenticationModule,它使用ClaimsPrincipal/ClaimsIdentity。相比之下,您的自定義模塊可以使用您想要的任

+0

「在桌面應用程序中,您有Thread的CurrentPrincipal」 - 也是在服務器應用程序中。 – Joe 2014-09-13 13:00:18

+0

@Joe:true。我只想舉一些例子,而不是全部。 – 2014-09-13 14:14:16

2

Active Directory,Windows Identity Foundation和Windows本身的標準身份驗證方法都使用IPrincipalIIdentity。基本上,如果你想使用任何內置的認證機制,你必須使用這些類。通常,您將擁有一個自定義數據庫模式來存儲用戶信息,並且您將從該數據創建IPrincipalIIdentity對象以執行身份驗證。