私は現在、Web APIサーバのかなり標準的なOWIN方式でリフレッシュトークンシステム(IAuthenticationTokenProvider
の実装)を設定しています。リフレッシュトークンプロバイダとコントローラの間のDBエンティティコンテキストの共有
これはStartup.Auth.cs
のConfigureAuth()
方法で割り当てられます:
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(accessTokenValidity),
Provider = new AuthorizationServerProvider(),
RefreshTokenProvider = new RefreshTokenProvider()
});
私はその後、自分のDB(Entity Frameworkの)コンテキストを管理(ApiController
の延長)各種コントローラを持っていますが、アクセス/リフレッシュトークンが通って処理されていますトークンプロバイダはプロバイダ自体の中でDBコンテキストを使用します。
上記のコントローラのいずれかのエンドポイントを経由して、通常のフローの外側にあるDB内のリフレッシュトークンを無効にしたいとします。これを行う際の問題は、コンテキストが共有されないため、次にトークンDBアクションが実行されるときにオプティミスティック並行処理の例外が発生することです。
これらの例外を回避するために、コンテキストを共有(またはアクセス)できるようにするにはどうすればよいでしょうか?
コンテキスト内を静的にし、プロバイダー内の静的メソッド経由でアクセスすることは間違っていますが、おそらく問題を解決するでしょう。編集:スレッドセーフはありませんので、そのオプションがあります。
私はをプロバイダのコンストラクタに渡しますが、すぐにコントローラと共有する方法はありません。
もう1つのオプションは、継続的にエンティティリフレッシュを強制的に実行します。ですが、これはハッキリであり、潜在的に並行性の問題が発生する可能性があります。
編集:第4の選択肢は、プロバイダまたはコントローラ内で操作を実行するたびに、新しいDbContext
を作成することです。これはMSの推奨事項であり、実際に私が選択したソリューションかもしれません。しかし、2つの要求が同時にレコードを変更すると、並行性の問題が発生する可能性があります。