2 回答

TA貢獻1921條經驗 獲得超9個贊
您正在嘗試訪問ExpenseManagerDbContext
應用程序的IdentityDbContext
. 因此,它本身是身份驗證系統的依賴項,并且將在框架執行身份驗證時得到解決。
所以流程有點像這樣:
請求進來了。
身份驗證中間件運行以對用戶進行身份驗證。
UserManager
解決了ExpenseManagerDbContext
。ExpenseManagerDbContext
解決了IGetClaimsProvider
。GetClaimsProvider
解析 HttpContext 并嘗試訪問用戶的聲明。身份驗證中間件執行身份驗證并設置
HttpContext.User
結果。
如果您查看步驟 5 和 6,您將看到在身份驗證中間件能夠實際對用戶進行身份驗證并更新上下文上的用戶對象之前訪問 HttpContext 。由于身份驗證中間件始終在請求開始時運行,因此情況始終如此。
我建議您重新考慮,ExpenseManagerDbContext
因為它可能不應該依賴于當前登錄的用戶。它應該獨立于此。如果您的邏輯依賴于用戶 ID,那么它可能應該是一個單獨的服務。

TA貢獻1810條經驗 獲得超4個贊
解決了!問題在于 IdentityDbContext 和 ApplicationDataDbContext 共享相同的 DbContext。在我的控制器中,我有以下代碼:
[Authorize]
public class AccountController : Controller
{
[HttpGet]
public IActionResult Index()
{
var accounts = _accountService.GetAll();
var models = _mapper.Map<List<AccountDto>>(accounts);
return View(models);
}
}
當我嘗試從瀏覽器調用控制器時,由于 [Authorize] 屬性,應用程序第一次初始化了 DbContext。這是在沒有任何 HttpContext 的情況下完成的。因此,當應用程序在“_accountService.GetAll()”中調用 DbContext 時,DbContext 已經實例化,并且沒有調用 Constructor 方法,因此,我的所有私有字段仍然為空!因此,我創建了第二個 DbContext 類,僅用于身份驗證/授權目的。
public class ApplicationDbAuthContext : IdentityDbContext
{
public ApplicationDbAuthContext(DbContextOptions<ApplicationDbAuthContext> options) : base(options)
{
}
}
因此,在控制器內發出請求期間,當我進行調用時會實例化正確的 DbContext,并且它包含 HttpContext。
我將更新存儲庫中的代碼以顯示更改。同時,感謝您的所有回答。
- 2 回答
- 0 關注
- 222 瀏覽
添加回答
舉報