2012-12-08 52 views
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) 
    { 
     ... 
    }  
} 

我需要验证为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服务器上最好的地方?

+1

看看消息检查器:http://msdn.microsoft.com/en-us/library/aa717047.aspx – trydis

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

回答

1

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