安全なWCFサービスを実装しています。認証は、ユーザー名/パスワードまたはWindowsクレデンシャルを使用して行われます。このサービスは、Windowsサービスプロセスでホストされます。今、私は各サービス操作の承認を実装するための最良の方法を見つけようとしています。
たとえば、次の方法について考えてみます。
public EntityInfo GetEntityInfo(string entityId);
ご存知かもしれませんが、WCFには、呼び出し元/クライアントから渡されたセキュリティ資格情報を取得できるOperationContextオブジェクトがあります。これで、メソッドの最初の行が呼び出されるまでに、認証はすでに終了しているはずです。しかし、決定が入力データ自体に依存する場合、どのように承認を実装しますか?たとえば、上記の場合、「admin」ユーザー(権限などがデータベースに保存されている)はエンティティ情報の取得を許可され、他のユーザーは許可されるべきではありません...承認チェックはどこに配置しますか?
次のように、メソッドの最初の行に配置するとします。
CheckAccessPermission(PermissionType.GetEntity, user, entityId) //user is pulled from the current OperationContext
ここで、いくつかの質問があります。
承認チェックの前または承認チェックの内部でentityIdを検証しますか(たとえば、null /空の値をチェックしますか?)言い換えれば、承認チェックをすべてのメソッドに含める必要がある場合、それは良いパターンですか?どちらを最初に行う必要がありますか-引数の検証または承認?
承認チェックがこのように至る所にあり、単体テストにOperationContextがない場合、WCFサービスを単体テストするにはどうすればよいですか?(WCFを設定せずに、このサービスクラスの実装を直接テストしようとしていると仮定します)。
アイデアはありますか?