2012-02-01 95 views
1

我正在使用C#编写一个安全的WCF REST Web服务。安全的WCF REST Web服务和头文件

我的代码是这样的:

public class MyServiceAuthorizationManager : ServiceAuthorizationManager 
{ 
    protected override bool CheckAccessCore(OperationContext operationContext) 
    { 
     base.CheckAccessCore(operationContext); 

     var ctx = WebOperationContext.Current; 
     var apikey = ctx.IncomingRequest.Headers[HttpRequestHeader.Authorization]; 
     var hash = ctx.IncomingRequest.Headers["Hash"]; 
     var datetime = ctx.IncomingRequest.Headers["DateTime"]; 
     ... 

我用头(授权,哈希,日期时间)来存储有关apikey,当前日期时间和散列请求的URL信息,同时请求主体只包含URL和web服务参数。

例子:

http://127.0.0.1:8081/helloto/daniele

这是正确的方式或者我已经从URL像这样通过和retieve这些参数:

http://127.0.0.1:8081/helloto/daniele&apikey=123&datetime=20120101&hash=ddjhgf764653ydhgdhgfjiutu56

是有这两个之间的差异方法?

回答

1

我认为这两种方法都适用于简单的情况。但是,如果您想最大限度地利用本机HTTP行为,则应该使用标头方法,而不是URL查询参数。

这将允许您(例如)使用HTTP响应代码向客户端指示资源已永久移动(响应代码301),以便客户端可以自动更新链接。如果URL包含认证信息,则客户端不清楚两个不同的URL实际上是指相同的资源。在其他重定向方案中,标题将自动包含,因此您不必担心追加参数以重定向URL。

此外,它应该允许更好的客户端缓存行为(如果这是您的方案相关)。

作为另一个例子,使用头文件可以让你在不需要客户端发送消息体的情况下仅基于头进行认证。这个想法是,您使用标头进行身份验证,然后向客户端发送一个HTTP 100 Continue响应。客户端不应该发送消息正文,直到它达到100.如果您正在执行具有大型消息主体的POST或PUT,这可能是一个重要的优化。

还有其他的例子,但是否任何给定的相关取决于你的场景和你期望服务的客户。

总之,我认为最好是使用协议的元素,因为它们是明确意图的 - 这会让您有机会像客户期望的那样行事,并且应该使您的服务更易于访问,高效且可用从长远来看。

1

根据您的实现,您的必需参数必须在请求的HTTP标头中传递,这肯定不在查询字符串中。

+0

我在问我的实现是否正确,或者如果最佳实践是使用请求体vs头来传递参数并在这种情况下返回参数。对不起,我可怜的解释。 – danyolgiax 2012-02-01 18:48:07

+0

@danyolgiax您绝对*从不*希望任何敏感数据(例如访问令牌)包含在URL中。如果可能的话,您可以在标题中找到它,或者如果不可能,则可以是POST主体的一部分。在你的情况下,我会建议所有三个HTTP标头。 – Randolpho 2012-02-01 21:50:56

+0

@Randolpho虽然你是正确的,你不应该把敏感数据放在一个URL中,把它放在标题或身体几乎没有更安全。通过网络观看流量的用户将在url后面的下一行看到这些标题。如果您使用的是HTTPS,则URL和标头都会被加密。 – 2012-02-01 22:00:30