C# 在刷新令牌提供程序和控制器之间共享DB实体上下文

C# 在刷新令牌提供程序和控制器之间共享DB实体上下文,c#,asp.net,asp.net-web-api,oauth,owin,C#,Asp.net,Asp.net Web Api,Oauth,Owin,我目前有一个刷新令牌系统(实现iaauthenticationtokenprovider)在我的Web API服务器中以相当标准的OWIN方式设置 这是在Startup.Auth.cs的ConfigureAuth()方法中分配的: app.useAuthorizationServer(新的OAuthorizationServerOptions() { AllowInsecureHttp=true, TokenEndpointPath=新路径字符串(“/token”), AccessTokenEx

我目前有一个刷新令牌系统(实现
iaauthenticationtokenprovider
)在我的Web API服务器中以相当标准的OWIN方式设置

这是在
Startup.Auth.cs
ConfigureAuth()方法中分配的:

app.useAuthorizationServer(新的OAuthorizationServerOptions()
{
AllowInsecureHttp=true,
TokenEndpointPath=新路径字符串(“/token”),
AccessTokenExpireTimeSpan=TimeSpan.FromMinutes(accessTokenValidity),
Provider=新的AuthorizationServerProvider(),
RefreshTokenProvider=新的RefreshTokenProvider()
});
然后,我有各种控制器(扩展
ApiController
),它们管理自己的DB(实体框架)上下文,但是通过令牌提供程序处理的访问/刷新令牌在提供程序本身中使用DB上下文

我想通过上述一个控制器中的端点,使正常流之外的DB中的刷新令牌无效。这样做的问题是,由于上下文不共享,因此在下次执行令牌DB操作时会导致乐观并发异常

对于我来说,共享(或访问)上下文以避免这些异常的最佳方式是什么

将上下文设置为静态并通过提供者内的静态方法访问上下文感觉是错误的,但可能会解决问题。编辑:并且没有线程安全性,所以有了这个选项

我可以将某个内容传递到提供者的构造函数中,但我没有立即找到与控制器共享该内容的方法

另一种选择是不断地强制实体刷新,但这会让人感觉不舒服,并且仍然可能存在并发问题


编辑:第四个选项是每次需要执行操作时创建一个新的
DbContext
,无论是在提供程序中还是在控制器中。这似乎是MS的建议,实际上可能是我选择的解决方案。但是,我觉得如果两个请求同时修改一个记录,这仍然可能为并发性问题打开大门。

我建议使用Unity或Autofac之类的DI容器,
您可以将dbcontext注册为SingleInstancePerRequest,并将dbcontext注入构造函数中,

我建议使用Unity或Autofac之类的DI容器, 您可以将dbcontext注册为SingleInstancePerRequest,并将dbcontext注入构造函数中