Asp.net

如何在 ASP.NET Identity 中定義不同的使用者類型?

  • April 11, 2015

在我的應用程序中,我使用的是 ASP.NET 身份,並且我有不同類型的使用者(教師、學生、…),它們有自己的屬性,對於教師,我有Experience, Languages Spoken, Certifications, Awards, Affiliations, ...,對於學生,我有不同的屬性。因此,由於每個使用者的資訊不同,因此我無法使用角色。所以他們實際上都是使用者,我的意思是他們可以登錄我的網站。他們也有共同的註冊資訊:First Name, Last Name, Email, Password現在你怎麼看,這樣做的最佳選擇是什麼?我應該為每個繼承自的使用者創建類IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim>嗎?任何的想法?

PS:我已經找到了一些解決方案,例如這裡的建議是使用 Claims 但對我來說還不夠清楚,實際上 Claims 是難題的一部分,我不明白它們是什麼?:),最好有例子。謝謝

方法#1:

索賠方法可能是要走的路。因此,您IdentityUser以正常方式派生並將公共屬性添加到派生類。然後對於每種類型的使用者,您將使用UserManager.AddClaimAsync.

因此,例如,假設您創建了一個名為的新類使用者類AppUser。然後你可以這樣做:

AppUser teacher = new AppUser { /* fill properties here */ };
/* Save User */
await userManager.AddClaimAsync(teacher.Id, new Claim("app_usertype", "teacher"));
await userManager.AddClaimAsync(teacher.Id, new Claim("app_grade", 4));
await userManager.AddClaimAsync(teacher.Id, new Claim("app_exp", 10));
await userManager.AddClaimAsync(teacher.Id, new Claim("app_awards", "Award1,Award2"));
await userManager.AddClaimAsync(teacher.Id, new Claim("app_langspoken", "English,French,German"));

AppUser student = new AppUser { /* fill properties here */ };
/* Save User */
await userManager.AddClaimAsync(student.Id, new Claim("app_usertype", "student"));
await userManager.AddClaimAsync(student.Id, new Claim("app_grade", 2));

這些將為不同類型的使用者添加不同的聲明。因此,teacher聲稱擁有“10”的“app_experience”、“Award1”和“Award2”的“app_awards”等。另一方面,student聲稱只有“2”的“app_grade”。

基本上,第一個參數標識聲明的類型,第二個參數是支持該聲明的數據。類型可以是任何類型,因此請選擇對您的應用程序有意義的類型,並可能在每個名稱前面加上前綴以將其與其他名稱區分開來。在這種情況下,我剛剛添加了“app”前綴。

然後,您可以使用UserManager.GetClaimsAsync獲取使用者的所有聲明,並在返回的列表中搜尋您感興趣的聲明。

方法#2

另一種方法是創建一個類AppUser,然後創建一個派生自. 在這些類中,您將添加屬性,否則這些屬性將在上面的範例中作為聲明添加。Teacher``Student``AppUser

這樣做的輕微缺點是,您必須為這些不同的使用者中的每一個創建單獨的表,並與 ASP.NET Identity 使用者表有關係。

另外,使用FindByUserNameAsync,FindByEmailAsync等只會返回單一類型的TUser, 在這種情況下AppUser. 此外,這些方法只會查詢一個表,AspNetUsers因此您可以從相關表TeacherStudent表中獲取額外資訊。

引用自:https://stackoverflow.com/questions/29566038