1

我有两个基类RequestBaseResponseBase, 分别用于请求和响应。从这些类派生的所有类型的请求和响应。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)
   {
      ...
   }       
}

我需要验证 and 的每个请求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哪里_userName

4

3 回答 3

1

在您的情况下,它看起来没有简单的方法来实现您想要的。通常,您可以在传输级别或 WCF 级别执行一些自定义操作,例如安全验证。如果您的服务托管在 IIS 中,您可以实现自定义身份验证模块,但这不是您的情况,因为安全信息位于数据合同中。WCF 也有几个可扩展点,如自定义端点行为、消息契约和 @trydis 消息检查器提到的。但它们都不适合开箱即用,因为它可能需要注意消息序列化和其他自定义事物。
更好的是在你的代码中继续这样做,如果你想优化你的代码,看看postsharp

于 2012-12-08T16:37:23.473 回答
1

我将使用自定义验证属性,然后应用企业库中的验证应用程序块。从这里的文档开始:http: //msdn.microsoft.com/en-us/library/ff650484.aspx

于 2012-12-08T16:53:35.660 回答
1

您想要实现并插入一个 Message Inspector

有关消息验证的相关用例的扩展列表,请查看此。将来它可能会派上用场。

于 2012-12-08T17:11:50.297 回答