在我的startup.cs文件的ConfigureServices
函数中,我对数据上下文进行了以下设置:
services.AddDbContext<MyDbContext>(options =>
{
options.UseSqlServer("Connection string");
});
然后为它设置身份服务。
services.AddIdentity<MyUser, MyRole>()
.AddEntityFrameworkStores<MyDbContext, int>()
.AddDefaultTokenProviders();
一切都适用于DI。我可以从我的控制器访问MyDbContext
和UserManager<MyUser>
,并获取我需要的数据。
我的印象也是(我已经阅读过)我为每个请求获得了MyDbContext
的新实例。我不会想到会发生什么。 MyDbContext
似乎是一个单身人士。
在服务器A中,我运行:await userManager.CheckPasswordAsync(aUser,"theirCurrentPassword");
当我找到用户并且密码正确时,它返回true。
在服务器B上,我指向相同的数据上下文并使用Identity服务。在服务器B上,我运行await userManager.ChangePasswordAsync(theSameUser, "theirCurrentPassword", "theirNewPassword")
。我知道这个函数可以工作并识别出这个变化,因为当我再次运行它时(从服务器B内部),它会给我一个错误,说明&#34;他们的当前密码&#34;是错的。
现在,回到服务器A,我通过一个不同的API调用再次运行userManager.CheckPasswordAsync
,但这次,传递新密码&#34;他们的新密码&#34;。我收到401(密码错误)。如果我输入&#34;他们的OldPassword&#34;它会成功,但我已经在服务器B上成功更改了该用户的密码。
我唯一能想到的是服务器A中的MyDbContext
即使在不同的HTTP请求中也是相同的实例,与文档相反。如果我关闭服务器A,重新启动它,并发出相同的请求,传入&#34;他们的新密码&#34;,它将按预期进行身份验证。我无法连续关闭和重启服务器A.
我相信我已经发布了我所关注的所有相关代码。如果没有,请告诉我。
那么我如何确保MyDbContext
和身份服务具有Scoped而不是Singleton生命周期?
此外,我如何手动实例化数据上下文并在控制器操作中明确设置UserManager<MyUser>
(AKA,试图避免DI,这似乎使我的数据上下文和身份服务单例)。?