在刷新令牌提供程序和控制器

时间:2017-01-30 16:12:46

标签: c# asp.net asp.net-web-api oauth owin

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

这是通过ConfigureAuth()的{​​{1}}方法分配的:

Startup.Auth.cs

然后我有各种控制器(扩展app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions() { AllowInsecureHttp = true, TokenEndpointPath = new PathString("/token"), AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(accessTokenValidity), Provider = new AuthorizationServerProvider(), RefreshTokenProvider = new RefreshTokenProvider() }); )来管理他们自己的DB(实体框架)上下文,但是通过令牌提供程序处理的访问/刷新令牌使用提供者本身内的DB上下文。

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

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

使上下文静态并通过提供程序中的静态方法访问它感觉不对,但可能会解决问题。编辑:并且没有线程安全,所以有选择。

我可以为提供者传递一些构造函数,但我不会立即看到一种方法与控制器共享它。

另一种选择是持续强制实体刷新,但这种感觉很麻烦,而且可能还会出现并发问题。

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

1 个答案:

答案 0 :(得分:0)

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