我有一个asp.net-core,Blazor服务器端应用程序,使用实体框架核心microsoft identity进行身份验证。
我试图在我的应用程序中获得当前用户,然后直接从我的DbContext访问用户对象。
我添加了DbContext作为服务
// Program.cs
builder.Services.AddDbContext<DataContext>(options =>
{
options.UseSqlServer(connectionString);
});
然后使用构造函数注入获取httpcontext,并设置用户对象
// Constructor injection
public DataContext(IHttpContextAccessor httpContextAccessor)
{
// Find the current user
var userId = httpContextAccessor.HttpContext.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
CurrentUser = this.Users.Where(x => x.Id == userId).Include(x => x.Location).FirstOrDefault();
}
这个工作正常,直到我刷新页面。当我这样做时,httpcontext被重置,并且无法找到当前用户。有没有办法绕过这个问题,或者有别的办法达到这个目的?
如果您希望此值在刷新期间持续存在,则可以从LocalStorage中存储和获取userid
。
如果用户重新加载页面或关闭并重新打开浏览器,则国家仍然存在。如果用户打开多个浏览器选项卡,则状态为跨选项卡共享。数据保存在localStorage中,直到显式地清除。
查看服务生命周期。你所经历的是一个有作用域的服务的默认行为。
在以下客户端组件场景中,限定了服务的作用域因为为用户创建了一个新电路而被重构:
- 用户关闭浏览器窗口。用户打开一个新窗口并导航回应用程序。
- 用户在浏览器窗口中关闭应用程序的一个选项卡。用户打开一个新标签页并导航回应用程序。
- 用户选择浏览器的重载/刷新按钮。
您也可以将您的服务定义为Singleton
,但您必须记住该实例将在所有用户之间共享。根据您的需求/应用程序,使用LocalStorage
可能更简单。