2008-11-07 112 views
6

我们有一个.NET Web服务API。目前,人们使用SOAP定义来使用API​​,因为我们需要通过SOAP头中的自定义认证元素进行认证。完美的作品。精细。什么是验证Web服务的最佳方式

SOAP要求该请求为POST。我们希望允许用户使用GET动词(因此它可以被缓存)。

那么,提供一个简单的GET API(不一定是web服务!)也提供身份验证的最佳方式是什么?

例如API路线:

http://www.blah.com/api/Search?query=Foo

这是可以接受的,共同的做法?

http://www.blah.com/api/Search?query=Foo&Key=<some guid>

注:我也不想实现SSL也不在IIS安装额外的软件或插件,等等,等等

回答

1

如果Web服务需要被保护,而且我假设它是因为你现在有一个认证头,那么你应该重新考虑使用GET和不使用SSL,至少对于认证部分。至少我会通过SSL向Web服务/应用程序发布授权请求。如果您不想为每个请求提供身份验证,那么您将需要接受(并在服务中生成)授权cookie,以供消费者用于后续请求。

我会避免在URL中使用身份验证,因为您希望支持GET - 如果可以缓存URL,那么凭据也将被缓存。这打破了Web服务的安全性,因为任何人都可以重用缓存的凭证。

+0

*)缓存应该只发生在客户端..所以凭据应该是相同的。 ??? *)请详细谈谈授权cookie? – 2008-11-07 04:16:10

0

使用只有GET的API,我会有第一个方法提取唯一的会话ID。

如:GET/API行动= AUTH &用户名=用户&密码= hashedpassword 将返回一个16个字符标记,其中存储在你的身边,你需要为每个后续调用这个独特的标记。

如果API是在PHP中完成的,则可以使用它的PHP的会话处理功能来实现此目的(它具有超时/垃圾收集)。 ASP.NET中有类似的功能。

它容易受到重播攻击(有人抓住或猜测会话ID),但如果你想要简单的东西,那就是要走的路。任何非HTTPS网站都将以同样的方式受到攻击。您可以将会话ID与用户的IP地址绑定以获得更高的安全性。

0

如果您使用的是WCF,则可以构建在内置的安全机制之上。如果你不想使用标准框架来实现安全性,你很可能会通过默默无闻的方式来实现安全。

+0

我尝试了一个简单的Web服务原型的WCF。我是一个面向代码的开发人员,所有这些xml配置都让我失望。此外,我从未发现如何添加自定义授权。 – 2008-12-24 13:48:11

1

如果您的客户端位于同一个域中,则可以在IIS应用程序中打开集成Windows身份验证。您的应用程序现在只接受Windows认证的用户。添加您自己的RoleProvider以实现更精细,基于角色的粒度。

0

与Thomas Eyde的答案类似:您可以使用siteminder之类的单一登录系统来保护URL。调用者请求需要包含令牌,该令牌通常存储在cookie中,但可以添加到查询字符串中。

如果不使用SSL,任何SSO或Web服务管理平台都将有意使认证变得困难。

相关问题