我们有一个.NET Web服务API。目前,人们使用SOAP定义来使用API,因为我们需要通过SOAP标头中的自定义Authentication元素进行身份验证。完美的工作。细
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等中安装额外的软件或插件等。
答案 0 :(得分:1)
如果需要保护Web服务,并且我假设它确实存在,因为您当前有一个Authentication头,那么您应该重新考虑使用GET而不使用SSL,至少对于身份验证部分。至少我会通过SSL将授权请求发布到Web服务/应用程序。如果您不希望在每个请求上提供身份验证,那么您将需要接受(并在服务中生成)授权cookie,消费者可以将其用于后续请求。
我会避免在URL中使用身份验证,这正是您要支持GET的原因 - 如果可以缓存URL,那么凭据也将被缓存。这会破坏Web服务的安全性,因为任何人都可以重用缓存的凭据。
答案 1 :(得分:1)
如果您的客户端位于同一个域中,则可以在IIS应用程序中启用集成Windows身份验证。您的应用程序现在只接受Windows身份验证用户。添加您自己的RoleProvider以获得更精细,基于角色的粒度。
答案 2 :(得分:0)
使用仅限GET的API,我会有第一个获取唯一会话ID的方法。
例如:GET / api?action = auth&amp; username = user&amp; password = hashedpassword 将返回一个16个字符标记,您存储在您的身边,并且您需要为每个后续呼叫提供此唯一标记。
如果API是在PHP中完成的,您可以使用PHP的会话处理功能来实现这一点(它具有超时/垃圾回收)。 ASP.NET中有类似的功能。
它容易受到重播攻击(有人抓住或猜测会话ID),但如果你想要简单的东西,那就是要走的路。任何非HTTPS网站都会以同样的方式受到攻击。您可以将会话ID与用户的IP地址绑定,以提高安全性。
答案 3 :(得分:0)
如果您使用的是WCF,则可以构建内置的安全机制。如果您不希望使用标准框架来实现安全性,那么您很可能会通过默默无闻来实现安全性。
答案 4 :(得分:0)
与Thomas Eyde的答案类似:您可以使用像siteminder这样的单点登录系统来保护URL。调用者请求需要包含一个令牌,该令牌通常存储在cookie中,但可以添加到查询字符串中。
如果不使用SSL,任何SSO或Web服务管理平台都会故意使身份验证变得困难。