安全的WCF REST Web服务和标头

时间:2012-02-01 18:38:25

标签: c# wcf web-services rest

我正在使用C#编写安全的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"];
        ...

我使用标题(Authorization,Hash,DateTime)存储有关apikey,当前日期时间和散列请求URL的信息,而请求正文仅包含URL和webservice参数。

示例:

http://127.0.0.1:8081/helloto/daniele

这是正确的方式,还是我要从URL传递和撤消这些参数:

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

这两种方法有区别吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

作为另一个示例,使用标头将允许您仅基于标头验证请求,而无需客户端发送邮件正文。我们的想法是您使用标头进行身份验证,然后向客户端发送HTTP 100 Continue响应。客户端不应该发送消息正文,直到它获得100.如果你正在使用大型消息体进行POST或PUT,这可能是一个重要的优化。

还有其他一些例子,但是否有任何一个例子取决于你的场景和你希望服务的客户。

总而言之,我认为最好使用协议的元素,因为它们是明确预期的 - 这为您提供了最好的机会,使客户期望并且应该使您的服务更易于访问,高效和可用于从长远来看。