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 关注
- 181 浏览
添加回答
举报