我有两个基类RequestBase
和ResponseBase
,分别用于请求和响应。从这些类派生的所有类型的requsets和响应。 RequestBase
包含ClientKey
和AccessToken
字段。另外,我有AuthenticationService
服务。
[ServiceContract]
public interface IAuthenticationService
{
[OperationContract]
public LoginResponse Login(LoginRequest request);
... other methods
}
假设我们有OrderService
服务。
public class OrderService:IOrderService
{
public OrderResponse GetOrders(OrderRequest request)
{
...
}
}
我需要验证ClientKey
和AccessToken
的每个请求,还要检查用户是否经过身份验证。我可以做到以下几点:
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
的最佳位置在哪里?
答案 0 :(得分:1)
在您的情况下看起来没有简单的方法来实现您想要的。通常,您可以在传输级别或WCF级别执行一些自定义操作,如安全性验证。如果您的服务托管在IIS中,则可以实现自定义身份验证模块,但不是您的情况,因为安全信息在数据协定中。 WCF还有几个可扩展点,如自定义端点行为Message Contracts,并由@trydis消息检查员提及。但它们都不适合您开箱即用,因为它可能需要注意邮件序列化和其他自定义事项 最好继续在您的代码中执行此操作,如果您想优化代码,请查看postsharp。
答案 1 :(得分:1)
我使用自定义验证属性,然后从企业库中应用验证应用程序块。从这里的文档开始:http://msdn.microsoft.com/en-us/library/ff650484.aspx。
答案 2 :(得分:1)
您想要实施和plug a Message Inspector。
有关消息验证的相关用例的扩展列表,take a look at this。它可能会在将来派上用场。