对 Web 服务进行身份验证的最佳方式是啥
Posted
技术标签:
【中文标题】对 Web 服务进行身份验证的最佳方式是啥【英文标题】:What is the best way to have Authenticate for a Web Service对 Web 服务进行身份验证的最佳方式是什么 【发布时间】:2008-11-07 01:12:11 【问题描述】:我们有一个 .NET Web 服务 API。目前,人们使用 SOAP 定义来使用 API,因为我们需要通过 SOAP 标头中的自定义 Authentication 元素进行身份验证。完美运行。很好。
SOAP 要求请求是 POST。我们希望允许用户使用 GET 动词(因此它可以被缓存)。
那么,提供一个简单的 GET API(不一定是网络服务!)同时提供身份验证的最佳方式是什么?
示例 API 路由:
http://www.blah.com/api/Search?query=Foo
这是一种可接受的常见做法吗?
http://www.blah.com/api/Search?query=Foo&Key=<some guid>
注意:我也不想实现 SSL,也不想在 IIS 等中安装额外的软件或插件等。
【问题讨论】:
【参考方案1】:如果需要保护 Web 服务,并且我假设它确实如此,因为您当前有一个 Authentication 标头,那么您应该重新考虑使用 GET 而不是使用 SSL,至少对于身份验证部分。至少我会通过 SSL 将授权请求发布到 Web 服务/应用程序。如果您不想为每个请求提供身份验证,那么您将需要接受(并在服务中生成)消费者可用于后续请求的授权 cookie。
出于您想要支持 GET 的确切原因,我会避免在 URL 中使用身份验证——如果 URL 可以被缓存,那么凭据也将被缓存。这破坏了 Web 服务的安全性,因为任何人都可以重复使用缓存的凭据。
【讨论】:
*) 缓存应该只发生在客户端..所以凭据应该是相同的。 ??? *) 可以多谈谈授权cookie吗?【参考方案2】:如果您的客户端在同一个域中,您可以在 IIS 应用程序中打开集成 Windows 身份验证。您的应用程序现在将只接受 Windows 身份验证的用户。添加您自己的 RoleProvider 以获得更精细、基于角色的粒度。
【讨论】:
【参考方案3】:使用仅 GET API,我将有一个获取唯一会话 ID 的第一个方法。
例如:GET /api?action=auth&username=user&password=hashedpassword 将返回一个 16 个字符的令牌,您将其存储在您身边,并且每次后续调用都需要此唯一令牌。
如果 API 是在 php 中完成的,您可以使用 PHP 的会话处理功能来实现这一点(它具有超时/垃圾收集)。 ASP.NET中也有类似的功能。
它很容易受到重放攻击(有人抓取或猜测会话 ID),但如果你想要一些简单的东西,那就是要走的路。任何非 HTTPS 网站都会以同样的方式受到攻击。您可以将会话 ID 与用户的 IP 地址绑定,以提高安全性。
【讨论】:
【参考方案4】:如果您使用 WCF,您可以在内置安全机制的基础上进行构建。如果你不想使用标准的安全框架,你很可能会通过默默无闻的方式来做安全。
【讨论】:
我在一个简单 Web 服务的原型上尝试了 WCF。我是一种面向代码的开发人员,所有这些 xml 配置都让我感到厌烦。此外,我从来没有发现如何添加自定义授权。【参考方案5】:类似于 Thomas Eyde 的回答:您可以使用像 siteminder 这样的单点登录系统来保护 URL。调用者请求需要包含一个令牌,该令牌通常存储在一个cookie中,但可以添加到查询字符串中。
如果不使用 SSL,任何 SSO 或 Web 服务管理平台都会故意使身份验证变得困难。
【讨论】:
以上是关于对 Web 服务进行身份验证的最佳方式是啥的主要内容,如果未能解决你的问题,请参考以下文章
使用 MySQL 对用户进行身份验证的最佳方式(接受其他建议)?