簡體   English   中英

AspNetCore Identity User 缺少 ApplicationUser 自定義屬性

[英]AspNetCore Identity User missing ApplicationUser custom properties

我創建了一個簡單的 AspNetCore(3.0 預覽版)Web 應用程序,該應用程序基於帶有應用程序內身份驗證的內置模板(遵循基本教程)。

我可以運行我的應用程序,當我嘗試轉到安全頁面時,我需要登錄。

我注冊並可以按預期登錄。 我可以在數據庫的 AspNetUsers 表中找到我的用戶。

我成功地修改了ApplicationUser以添加CustomTag (string)並運行 EF 遷移和更新以將此列添加到AspNetUsers表中。 我使用 SQL UPDATE AspNetUsers...命令填充該列,因此該列現在包含“Hello World!”。

現在我運行我的應用程序,但我沒有關於經過身份驗證的用戶的有用數據,除了他已經過身份驗證。

我在控制器操作中放置了一個斷點以查看經過身份驗證的ApplicationUser ,我看到 IdentityServer4 添加了 13 個聲明的身份,但我不知道這與我的用戶有什么關系? 用戶已通過身份驗證,但名稱為 NULL。 該用戶沒有我的自定義屬性“CustomTag”。 我找錯地方了嗎?

大量搜索導致有關如何擴展模型(完成)以及如何運行 EF 遷移(完成)的深入文章。

許多搜索導致有關如何覆蓋 IdentityServer4 的代碼和 UI 的深入文章,但在我的模板化應用程序中沒有這些內容,所以我不知道應該在哪里修改代碼。

任何人都可以指出一些告訴我如何讓我的ApplicationUser自定義屬性在控制器動作處理程序中可見的東西嗎?

你在這里處理兩件不同的事情。 身份是一個用戶管理系統 它獨立於 ASP.NET Core 中的身份驗證/授權中間件(可以使用或不使用 Identity)。

進行身份驗證時,會創建ClaimsPrincipal 實體框架身份提供程序根據數據庫中AspNetUsers表中的內容填充一些聲明,但僅填充它本質上知道的內容。 它顯然沒有您添加的自定義屬性的內置知識,因此不包括這些。 Identity Server 只是充當集中身份提供者,創建此主體,然后將發送回請求應用程序。

總而言之,您在這里處理的不是ApplicationUser ,而是與從身份驗證創建的特定主體相關聯的聲明的集合。

如果需要,您可以隨時獲取實際關聯的ApplicationUser以獲取任何自定義數據:

var user = await _userManager.FindByIdAsync(User.FindFirstValue(ClaimTypes.NameIdentitifer));

您還可以選擇通過派生自UserClaimsPrincipalFactory<TUser>並覆蓋CreateAsync來補充聲明集合,以添加來自任何來源(包括數據庫)的其他聲明。 不過,這只能直接在 ASP.NET Core 中工作。 對於 Identity Server,您需要實現自定義IProfileService

如果要檢索有關當前用戶的完整詳細信息,可以在控制器操作中使用如下代碼:

var user = await _userManager.GetUserAsync(User); //_userManager is an instance of UserManager<TUser>

如果您希望在登錄時將聲明加載到 auth cookie 中,那么您可以創建和注冊(通過IdentityBuilder.AddClaimsPrincipalFactory<TFactory>() )您自己的UserClaimsPrincipalFactory<TUser, TRole>實現,它可以將您的其他屬性添加為登錄時聲明,這意味着您不必訪問數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM