4

次のシナリオを処理する方法に関するいくつかのベスト プラクティスを探しています - WCF サービス レイヤーから UI へのアクセス許可のフロー:

PrincipalPermission 属性で装飾されたメソッドを含む WCF サービスがあります。メソッドを呼び出す前に、クライアントが必要なアクセス許可を持っているかどうかを確認できるようにする手段が必要です。

この基本的な例は、ユーザーが特定の機能 (注文の送信など) を実行できるかどうかを確認することであり、UI 内のボタンを有効/無効にするために使用できます。

可能なオプションは、サービスのような「おしゃべりな」操作を追加するか、代わりにプロパティを持つメッセージを返すbool CanSubmitOrder()単一のメソッドを使用することです ? 次に、「Submit Order」ボタンの有効状態を結果に設定できます。OrderServicePermissions GetPermissions()CanSubmitOrder

それで、より良いアプローチ、またはベストプラクティスさえ知っている人はいますか?

前もって感謝します!

4

3 に答える 3

0

サービス呼び出しに属性を設定することの重要な点はPrincipalPermission、呼び出し元が呼び出す権限を持っているかどうかを事前に確認する必要がないことです。持っていない場合、WCFランタイムは例外をスローします。

この組み込みのメカニズムだけに頼らないのはなぜですか?サービス呼び出しをtry..catchブロックに入れて、実際に発生した場合に例外を処理しないのはなぜですか?とにかく「例外的な」ケースであるはずですよね?

あなたが説明した以外の「魔法の」方法は見当たりません。ただし、一般的に受け入れられている方法は、例外が発生した場合に呼び出して処理することです。

マーク

于 2009-09-25T16:38:51.660 に答える
0

Windows Identity Foundation (WIF) を使用してサービスを保護するようにアプリケーションを進化させることができれば、RequestSecurityTokenResponse の DisplayToken プロパティを使用してこれを実現できます。

http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.protocols.wstrust.requestsecuritytokenresponse.requesteddisplaytoken.aspx

セキュリティ トークン サービスがそれをサポートしていると仮定すると、表示トークンには、ユーザーが呼び出すことができないサービスにバインドされているコントロールを無効にするなど、ユーザーのアクセス許可を UI に渡すことができるクレーム セットが含まれている可能性があります。表示トークンは、CardSpace 用に実装された WS-Trust の拡張機能であるため、Windows の世界以外ではあまり広くサポートされない可能性があります。

ただし、表示トークンは悪いニュースであり、同一性の第 1 法則に違反していると考える人もいることに注意してください。

http://www.francisshanahan.com

他の人は、それが一般的な問題に対する合理的で実用的な解決策であると考えています:

http://blogs.msdn.com/b/vbertocci/archive/2007/10/31/on-displaytoken.aspx

于 2011-10-11T19:53:29.480 に答える
0

チェック ロジックを実装するには、次の 2 つの一般的なタイプがあります。

  1. ライブラリを共有します。例は「RIA サービス + Silverlight」です。

    プラス:実装が簡単。

    短所:相互運用性がない (.NET のみ)。ライブラリが変更されるたびにクライアントの更新が必要です。

  2. サービス部分に共通のメソッド検証を実装します。 長所:相互運用性、チェック ロジックが変更された場合にクライアントを更新する必要がない

    マイナス:それはあなただけにあるため、複雑になる可能性があります

SOA を使用する場合は、.NET がどこにでもある会社でのみアプリケーションを使用していない場合に限り、2 番目の選択肢を使用することをお勧めします。

一般的な例を考えてみましょう。windows/wpf フォームがあります。また、string 型の「surname」と int 型の「age」の 2 つのフィールドがあります。そして「保存」ボタン。クライアント側でいくつかのチェックを実装する必要があります

1) 一部のユーザーでは、[保存] ボタンが無効になっています。

2) 姓を空にすることはできず、最大長は 256 です。

3) age は 0 未満にはできません。

保存するメソッドの呼び出しは

void Save(string surname, int age);

サービスに 2 番目のメソッドを作成します。このメソッドは、検証情報を含む PermissonAnswerDTO のオブジェクト タイプを返します。

PermissonAnswerDTO SaveValidate(string surname, int age);

および主な検証方法

// If arguments are wrong
        [FaultContract(typeof(NotSupportedException))]
        // If the user have permisson to invoke this method
        [FaultContract(typeof(CustomNotEnoughPermission))]
        PermissonAnswerDTO Validate(string methodName, object[] methodParams);

検証。

Validate("SaveValidate", null)ウィンドウの読み込み時に呼び出します。タイプ CustomNotEnoughPermission の例外がスローされた場合、「保存」ボタンをブロックします。

ユーザーが保存できる場合は、ユーザーのデータを呼び出しますValidate("SaveValidate", object[2]{"Surname", "-60"};。-60 は有効ではないため、タイプ PermissonAnswerDTO の回答オブジェクトを次の情報とともに取得します。

ParameterName: "age",
ExceptionMessage: "age cannot be less then null".

そして、この情報をユーザーに適切に表示できます。


これについての私の考えは、いつの日か Microsoft がこれを実装し、いつものように新しいテクノロジを呼び出すだろうということです。ほとんどの場合、Microsoft のテクノロジは宣伝されているほど革新的ではありません。例としては、Windows Identity Foundation と Reactive Extensions があります。

完全な例

[DataContract]
    public class ParameterExceptionExplanaitonDTO
    {
        [DataMember]
        public string ParameterName;
        [DataMember]
        public string ExceptionMessage;
    }

[DataContract]
public class PermissonAnswerDTO
{
    [DataMember]
    public bool IsValid;

    [DataMember]
    public ParameterExceptionExplanaitonDTO[] ParameterExceptions;
}

public class Service1 : WcfContracts.IService1
{
    // If arguments are wrong
    [FaultContract(typeof(NotSupportedException))]
    // If the user have permisson to invoke this method
    [FaultContract(typeof(CustomNotEnoughPermission))]
    public PermissonAnswerDTO Validate(string methodName, object[] methodParams)
    {
        //1) Using Reflection find the method with name = <methodName + Validate>
        //2) Using Reflection cast each object in "object[] methodParams" to the required type
        //3) Invoke method
    }

    private PermissonAnswerDTO GetUserNameValidate(int id)
    {
        //logic to check param
    }

    public string GetUserName(int id) 
    {
        // if the user calls method we need validate parameter
        GetUserNameValidate(id);

        //some logic to retreive name
    }
}
于 2012-04-08T12:26:36.857 に答える