看起来像DbContext和ASP.net核心身份服务是Singleton,而不是如文档所述

时间:2017-03-01 02:21:30

标签: dependency-injection asp.net-core asp.net-identity asp.net-core-identity

在我的startup.cs文件的ConfigureServices函数中,我对数据上下文进行了以下设置:

services.AddDbContext<MyDbContext>(options =>
   {
       options.UseSqlServer("Connection string");
   });

然后为它设置身份服务。

 services.AddIdentity<MyUser, MyRole>()
         .AddEntityFrameworkStores<MyDbContext, int>()
         .AddDefaultTokenProviders();

一切都适用于DI。我可以从我的控制器访问MyDbContextUserManager<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,这似乎使我的数据上下文和身份服务单例)。?

0 个答案:

没有答案