2013-04-06 126 views
3

我有它使用许多不同的技术,如Java的,.NET等因此,我的用户凭据存储在一个单独的数据库客户应用的Web API Web服务如何为我的Web API Web服务实现身份验证和授权?

我的Web服务托管内IIS我已经配置并启用服务器端SSL这可以确保请求/响应消息进行加密和签名。

我还配置了IIS的IP地址限制功能,以允许来自少数几个已知IP地址的请求。

我不喜欢使用基本身份验证因为它以纯文本格式发送凭证,但每封邮件都使用SSL加密。

我不能使用集成Windows身份验证显然是因为我的用户与我的服务器不在同一个域中。

我不能使用表单身份验证因为我的客户端不是基于浏览器的。

那么为我的web服务实现身份验证和授权的最佳方式是什么?

我在想一个办法是提供一个进行身份验证(用户名,密码)Web方法其行为类似于身份提供商/安全性令牌服务,并产生特定于该用户的令牌,该令牌后,某些到期时间。然后,客户端必须发送带有每个Web方法请求的身份验证令牌,并通过为我的控制器创建自定义授权过滤器来确保它。

这种方法的优点是用户不必为每个请求发送用户名/密码,而只需要一个临时令牌。显然,管理令牌生活的缺点是;它应该何时到期?例如如果一小时内没有提出请求。

什么是为我的web服务实现身份验证和授权的最佳方式?

+0

如果会话使用SSL进行保护,那么数据并不是以明文形式发送的,对吗? :-) – Craig 2013-06-24 15:20:37

回答

0

在Facebook中,它们向应用程序提供访问令牌,只有在密码发生更改或用户特别取消授权应用程序时才会更改。你很多人考虑这种方法。这在Google的Map API中也是如此。我能想到的唯一安全方法是检查请求来自哪里(请求的IP地址),然后检查apikey然后回应。

+0

谢谢Tariq。是的访问令牌非常相似。 – 2013-04-06 18:30:13

+0

更改用户密码更改令牌听起来很不错。不过,依靠远程IP地址不应该被认为是非常安全的。 – jszobody 2013-04-06 18:30:57

1

IP地址可能很容易被欺骗,所以不要依靠它们来保护您的服务。

我建议您只允许通过HTTPS进行访问,并为了进一步加强安全性,请验证请求已签署的证书。更好的是,拥有自己的证书服务器并为此发布自己的证书。

4

我将在我的评论中讨论有关SOAP服务的认证选项。授权在服务器应用程序中实现,并且与所选的认证类型无关。 有三(3)的Web服务分类: -Private - 社区 - 公共

这听起来像您所提供的网络服务是社区服务,因为它仅适用于可信赖的合作伙伴。我知道这是因为你解释过在IIS中配置了IP地址限制。包括IP地址限制是实施安全Web服务的很多好方法之一。安全不是一回事。它是许多防御的积累。 IP地址限制是一个好的开始。

Web服务本质上是无状态的。因此,在调用Web服务时,通常必须在每个请求中包含凭证(用户名和密码)。所以,这不是问题或担心。

HTTP基本认证不是一个不错的选择。它受到所有客户端和服务器应用程序的支持,并且易于实施。我喜欢将HTTP基本认证作为最低公分母。我不排除它。 HTTP基本身份验证在纯文本中包含http标头中的凭证,因此始终建议使用SSL(HTTPS)来加密传输通道。

WS-Security是一个非常常见的Web服务授权标准。它是Web服务的行业标准,规范由结构化信息标准促进组织(OASIS)组织发布。 WS-Security包含一个用于包含用户名/密码的UsernameToken配置文件。 WS-Security块被添加到SOAP消息的头部。相比之下,HTTP基本认证被添加到HTTP标头。 HTTP基本认证附加到传输协议。相比之下,WS-Security附加到SOAP消息。 WS-Security UsernameToken采用纯文本格式,因此始终建议使用SSL(HTTPS)。

另一个选项是客户端证书认证。此选项使用数字证书作为身份验证令牌来代替用户名/密码。此方法运行良好,但要求Web服务团队成员和客户端应用程序团队成员都必须熟悉SSL数字证书作为先决条件。这种方法的学习曲线比其他方法高。

您所描述的定制的解决方案是没有必要的,因为有很多的行业标准存在的实现和解决你所寻求的解决方案。例如,如果在Web服务中实现WS-Security,则不必为客户端应用程序团队提供文档,并解释如何在客户端应用程序中实现它。 WS-Security是一个行业标准,已被大多数现代SOAP服务器和SOAP客户端记录和支持。这同样适用于HTTP基本认证。

我希望这会有所帮助。干杯,DCova

+0

+1优秀的答案 – 2013-04-07 20:24:40

0

我的Web服务托管在IIS中,我已在服务器端配置并启用SSL,以确保请求/响应消息已加密并签名。

SSL是传输安全,而不是邮件的安全性。它不会为你签名。它加密了频道。

我觉得预共享密钥或API密钥将工作最适合你的情况的方法。由于用户有用户名和密码,我假设他们在某处注册。作为该过程的一部分,生成一个密钥,该密钥可以是共享对称密钥,即双方(客户端和服务器)具有相同的密钥。客户端在某些自定义方案的Authentication标头中发送用户标识,并在请求消息的特定部分中发送SHA256散列标识。服务器获取用户ID,检索密钥,计算消息的相同部分的哈希值,如果哈希匹配,则客户端处于。

查看我的书Pro ASP.NET Web API Security