1

リクエストとレスポンスにそれぞれ2 つの基本クラスRequestBaseとがあります。ResponseBaseこれらのクラスから派生したすべてのタイプの要求と応答。RequestBase含まれるフィールドClientKeyAccessTokenフィールド。また、私はAuthenticationServiceサービスを持っています。

[ServiceContract]
public interface IAuthenticationService
{
   [OperationContract]
   public LoginResponse Login(LoginRequest request);
   ... other methods
}

サービスがあるとしOrderServiceます。

public class OrderService:IOrderService
{       
   public OrderResponse GetOrders(OrderRequest request)
   {
      ...
   }       
}

と の各リクエストを検証し、ユーザーが認証されているかどうかも確認する必要ClientKeyAccessTokenあります。私は次のことができます:

public OrderResponse GetOrders(OrderRequest request)
{
   var response = new OrderResponse(request.RequestId);
   // call helper method for validation
   var validationResult = ValidateRequest.Validate(request, response, ValidateOptions.All)  
   ...
}  

しかし、私はすべてのメソッドにこのコード行を書きたくありません:

var validationResult = Validate.ValidRequest(request, response, ValidateOptions.All)

これを行う最善の方法は何ですか?


PS。これはValidate方法です:

public static bool Validate(RequestBase request, ResponseBase response, ValidateOptions validate)
{
   //Validate Client Key. 
   // Hardcoded here.
   if ((Validate.ClientKey & validate) == Validate.ClientKey)
   {
      if (request.ClientKey != "ABC123")
      {
         response.Acknowledge = AcknowledgeType.Failure;
         response.Message = "Unknown Client Key";
         return false;
      }
   }    

   // Validate access token
   if ((Validate.AccessToken & validate) == Validate.AccessToken)
   {
      if (request.AccessToken != _accessToken)
      {
         response.Acknowledge = AcknowledgeType.Failure;
         response.Message = "Invalid or expired AccessToken. Call GetToken()";
         return false;
      }
   }

   // Validate user credentials
   if ((Validate.UserCredentials & validate) == Validate.UserCredentials)
   {
      if (_userName == null) 
      {
         response.Acknowledge = AcknowledgeType.Failure;
         response.Message = "Please login and provide user credentials before accessing these methods.";
         return false;
      }
   }

   return true;
}

_accessTokenもう 1 つの質問:を_userNameサーバーに保存するのに最適な場所はどこですか?

4

3 に答える 3

1

あなたの場合、あなたが望むことを達成する簡単な方法はないように見えます。一般に、トランスポートレベルまたはWCFレベルのいずれかで、セキュリティ検証などのカスタム処理を実行できます。サービスがIISでホストされている場合は、カスタム認証モジュールを実装できますが、セキュリティ情報はデータコントラクトに含まれているため、そうではありません。WCFには、カスタムエンドポイントの動作、メッセージコントラクト、@ trydisメッセージインスペクターによる言及など、いくつかの拡張ポイントもあります。ただし、メッセージのシリアル化やその他のカスタム処理に注意を払う必要があるため、これらはすべてそのままでは適していません。
コードでこれを継続することをお勧めします。コードを最適化する場合は、postsharpを参照してください。

于 2012-12-08T16:37:23.473 に答える
1

カスタムの検証属性を使用してから、Enterprise Library から Validation Application Block を適用します。http://msdn.microsoft.com/en-us/library/ff650484.aspxのドキュメントから始めます。

于 2012-12-08T16:53:35.660 に答える
1

Message Inspectorを実装してプラグインしたい。

メッセージ検証に関連する使用例の拡張リストについては、こちらをご覧ください。将来的に重宝しそうです。

于 2012-12-08T17:11:50.297 に答える