現在、バックエンド インフラストラクチャに取り組んでおり、アドバイスが必要な場合があります。
まず、現在のグローバル アーキテクチャは次のとおりです。
- IIS でホストされている WCF サービスがあります
- SQL Server でホストされている複数のデータベースがあります。クライアントごとに 1つの
ClientData
データベースと 1 つのグローバルMasterDatabase
. MasterDatabase
接続文字列に関連付けられた資格情報のマッピングが含まれています。そのデータベースによりClientData
、提供された資格情報に応じて (Entity Framework 経由で) 適切なデータベースを使用できます。- SSL経由でBasic認証を使用しています。
- 資格情報の検証は
checkAccessCore()
、ServiceAuthorizationManager
サブクラスのオーバーライドされたメソッドで行われます。そのメソッド内で fetchMasterDatabase
を実行し、資格情報が正しいことを確認し (パスワードは Bcrypt を使用して DB に保存されます)、接続文字列を取得します。 - 接続文字列が取得されたら、
CustomIdentity
から継承するクラスのインスタンスを作成しますGenericIdentity
。そのインスタンスを使用して、Thread.CurrentPrincipal
プロパティを設定できます。 - 各 WCF サービス実装は
CustomPrincipal
、適切なデータベースからデータをフェッチするために、から接続文字列を取得しClientData
ます。
私の質問/考えは次のとおりです。
CheckAccessCore
WCF サービスで同時実行を使用することにした場合、それは同時操作を順次実行する WCF 拡張機能のメソッドであるため、どのように処理すればよいでしょうか?http://support.microsoft.com/kb/KbView/2907010
これは、すべての呼び出しがキューに入れられ、
checkAccessCore
レベルでブロックされることを意味します。オーバーライド
checkAccessCore
は、ユーザーの資格情報を確認するためにコール スタックの早い段階で呼び出しをインターセプトする最良の方法です。カスタム ID 以外でクライアント接続文字列を転送する別の方法を使用する必要がありますか? 安全ですか?
CustomPrincipal
同時実行を使用すると、に設定された IDがオーバーライドされると思います。はいの場合、それをどのように処理しますか?