1

現在直面している課題について、何らかの意見を求めています。

私のシステムが提供するいくつかの WCF サービスを呼び出したいユーザーを識別するために使用するカスタム WIF STS を作成しました。WCF サービスは、呼び出し元が特定のサービスを呼び出すために必要なクレームを持っているかどうかを判断するカスタム承認マネージャーを使用します。

今、私はWPFアプリを構築しています。これらの WCF サービスの上に。ビュー モデルが保護された WCF サービス (モデルを実装する) を呼び出すように、MVVM パターンを使用しています。私が直面している課題は、現在のユーザーが Web サービス メソッドを実際に呼び出さずに正常に呼び出すことができるかどうかわからないことです。基本的に、私が達成したいのは、メソッドを正常に呼び出す機能に基づいて、UI の特定の部分を有効/無効にすることです。

これまでに思いついた最善の解決策は、カスタム承認ポリシー マネージャーと同じビジネス ロジックに基づいて、ユーザーが特定のメソッドを呼び出すことができるかどうかを判断できるサービスを作成することです。ここで、メソッドはこのサービスに文字列、または実際には ServiceAddress と Method (Action) の 2 つの文字列として渡す必要があり、その入力に基づいて、サービスは現在のユーザーがアクセスに必要なクレームを持っているかどうかを判断できます。メソッド。明らかに、これが機能するためには、このサービス自体が同じ STS から発行されたトークンを要求し、同じクレームを使用して、その仕事を行う必要があります。

過去に似たようなことをした人はいますか、それともこれを行う方法について何か良いアイデアはありますか?

前もって感謝します、

クラウス

4

2 に答える 2

1

私が採用したアプローチは、サービスの背後にあるメソッドを保護するために ClaimSet の検査を行うクラスです。属性を使用して、メソッドを型、リソース、および適切なプロパティ値で装飾します。次に、検査クラスには、呼び出し元の ClaimSet にそれらのプロパティ値を持つ Claim が含まれていない場合に例外をスローする Demand メソッドがあります。そのため、メソッド コードが実行される前に、クレーム検査要求が最初に呼び出されます。要求後もメソッドが実行されている場合、呼び出し元は良好です。インスペクション クラスには、例外をスローせずに同じ質問 (呼び出し元に適切なクレームがあるかどうか) に答える bool 関数もあります。

次に、インスペクション クラスをパッケージ化して、クライアントと共にデプロイします。クライアントが呼び出し元の ClaimSet (サービスの GetClaimSet メソッドを介して提供) も取得できる限り、同じ評価を行うために必要なすべてのものが含まれます。ドメインモデルが行っています。次に、ビュー モデルの ICommand プロパティの CanExecute メソッドでクレーム インスペクション クラスの bool メソッドを使用して、コントロールを有効/無効にし、基本的に、ユーザーがクレームを持っていないことを実行させないようにすることで、ユーザーが承認例外を取得しないようにします。為に。

どのメソッドにどのクレームが必要かをクライアントがどのように知るかについては、クライアントの開発者に任せていると思います。私のプロジェクトでは一般的に、これは大きな問題ではありません。したがって、メソッドが Apple を追加することである場合、必要なクレームは直観的に Type = Apple、Right = Add になります。

これがあなたの状況に役立つかどうかはわかりませんが、私が行ったいくつかのプロジェクトではうまく機能しています.

于 2009-12-01T19:58:55.017 に答える