2010-07-18 56 views
16

我想存儲額外的信息,通過驗證的用戶,這樣我可以把它方便(如User.Identity.Id,例如),而不是僅僅的名字,因爲我打算在具有非唯一。如何在ASP.NET MVC中實現自定義Principal和Identity?

到目前爲止,我收集了,我應該去實現自定義的校長和/或身份,但我不知道如何去做。我一直在尋找關於這個問題的文檔和教程,但我在不同的地方找到了相關的東西,我發現它有點混亂。

我已經看到了如何自定義信息添加到用戶數據屬性的身份驗證cookie,但我想有依賴注入的單元測試,我可以有校長和身份利益。

什麼確切步驟,我需要考慮如果我想實現我自己的主體或身份?

會是什麼,我可以在這種情況下做的最簡單(只需要添加的ID,並保持所有默認設置到位)? 「默認」將包括默認提供者(會員,角色等)。

我已經看過other question,但是我會很欣賞不會留下任何漏洞的答案,例如示例中的AuthenticateRequest事件中的角色魔術字符串。相反,我需要知道如何將默認SqlRoleProvider中的角色添加到當前用戶:何時何地執行此操作,以及是否需要執行其他任何操作來將我的新類與其他默認提供程序連接起來。

這將會是真棒,能夠去一個樣品的ASP.NET MVC 2應用程序(從Visual Studio 2010的模板,例如),進行編輯和它的工作。


編輯:我已經編輯的問題,以更好地顯示,我幾乎失去在這裏,所以我不能湊合着過高水平的答案。

收錄人:在我看來,在身份證上代替身份證是更有意義的,儘管我已經在某種程度上說過了。

+0

您目前是否設置了表單身份驗證和角色?我做的是 – 2010-07-30 20:59:56

+0

。我從VS 2010模板開始使用MVC Web應用程序(而不是MVC *空* Web應用程序),因此它具有用於用戶管理的所有默認SQL提供程序:包括成員資格和角色。但大部分都是在窗簾後面完成的。通過約定,因爲它是 – 2010-07-30 23:08:01

+0

你不能只使用配置文件支持這種事情?這就是爲什麼(與用戶相關的額外數據) - 應該比嘗試創建一個'自定義用戶'更簡單我認爲 – 2010-08-04 20:40:44

回答

20

這個問題已經被問和回答之前: ASP.NET MVC - Set custom IIdentity or IPrincipal

但總結...

木箱與要存儲附加性質在一個自定義的主類:

Public Class CustomPrincipal 
    Inherits System.Security.Principal.GenericPrincipal 

    Private _eyeColor As String 
    Public ReadOnly Property EyeColor As String 
     Get 
      Return _eyeColor 
     End Get 
    End Property 

    Public Sub New(id As System.Security.Principal.IIdentity, roles As String(), eyeColor As String) 
     MyBase.New(id, roles) 
     _eyeColor = eyeColor    
    End Sub 

End Class 

修改Global.asax的Global.Application_AuthenticateRequest使用您的自定義主體:

Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs) 
    ... 
    Dim roles() As String = {"examplerole"}   
    Context.User = new CustomPrincipal(Context.User.Identity, roles, "green") 
End Sub 

然後在你的代碼的其他地方,當你想引用這些屬性之一做到這一點:

CType(My.User.CurrentPrincipal, CustomPrincipal).EyeColor 
+0

Seth - 你從哪裏得到「綠色」?你是否在每個Application_AuthenticateRequest中從數據庫中檢索它?你把它存儲在會話變量中嗎? – mga911 2011-08-22 16:44:05

+0

@ mga911 - 在本例中,「綠色」是硬編碼的。在一個真正的Web應用程序中,我會從數據庫中讀取它,並可能將其存儲在cookie中。在對AuthenticateRequest的附加調用中,可以從cookie中讀取它以防止db調用。會話變量不在這裏,因爲AuthenticateRequest在SessionStart之前被調用。 – 2011-08-24 15:37:13

2

你不能指望真的有人可以教你一切你不知道的.NET幾段。你可以在MSDN http://msdn.microsoft.com/en-us/library/system.security.principal.genericprincipal.aspx上看到很好的例子,並通過這個類來挖掘它,它是Reflector中的衍生物 - 沒有什麼特別的。

角色只是您自己使用的名稱的字符串列表,在您的應用程序/服務器中。

話雖如此,你根本不必針對確切的GenericPrincipal衍生物。退房

HttpContext.Current.Items 

這是一個Hashtable的免費使用只爲你的服務請求 - 這意味着在一個點上,你可以不這樣說:在代碼

HttpContext.Current.Items["TokenUser"] = new MyThinUser(anything,I,want,there); 

然後everythere否則只是做:

var user = HttpContext.Current.Items["TokenUser"] as MyThinUser; 

你就完成了。

將您需要/想要從驗證代碼傳遞給所有其他功能的所有內容存儲在您的新類中。保留用戶財產完好(所以你可以偷看它,而不必擔心你改變了一些東西)。 Wihr你可以隨意簡化或複雜你的系統,但你保持完全的獨立性。

例如,如果你有自己的認證,只有幾個級別的訪問而不是枚舉角色,你可以攜帶好的舊訪問級別號碼(無論如何,字符串攜帶的枚舉角色是非常低效的)。

請記住,VS中的自動生成的樣本通常適用於某些特定場景。所以如果你看到用於用戶管理的SQL提供者並不意味着你實際上必須使用它 - 你仍然可以調用你自己的sproc來從你自己的SQL表中獲得你需要的東西。

+0

這是一個有趣的方法。 – Dementic 2015-01-08 12:50:43