如何为我的Web API Web服务实现身份验证和授权?

时间:2013-04-06 17:55:52

标签: asp.net-mvc web-services security asp.net-web-api

我有一个 Web API Web服务,它被许多客户端应用程序使用,使用不同的技术,如 Java,.NET等。因此,我的用户凭据是存储在单独的数据库

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

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

我不喜欢使用基本身份验证,因为它使用每条消息以纯文本形式发送凭据,尽管邮件是使用SSL加密的。

我无法使用集成Windows身份验证,因为我的用户与我的服务器不在同一个域中。

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

那么为我的网络服务实施身份验证和授权的最佳方法是什么?

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

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

为我的网络服务实施身份验证和授权的最佳方法是什么?

4 个答案:

答案 0 :(得分:4)

我将在关于SOAP服务的评论中解决身份验证选项。授权在服务器应用程序中实现,并且与所选的身份验证类型无关。 Web服务有三(3)种分类: -私人的 -社区 -public

听起来您提供的网络服务是社区服务,因为它仅供受信任的合作伙伴使用。我知道这是因为你解释说在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

答案 1 :(得分:1)

IP地址可能非常容易被欺骗,因此请不要依赖它们来保护您的服务。

我建议您仅允许通过HTTPS进行访问,并进一步保护它,验证用于签署请求的证书。更好的是,拥有自己的证书服务器并为此目的颁发自己的证书。

答案 2 :(得分:0)

在Facebook中,它们为应用程序提供访问令牌,只有在密码更改或用户明确取消授权应用程序时才会更改。你很多人都会考虑这种方法这在Google的Map API中也是类似的。我能想到的唯一安全的方法是检查请求的来源(请求的IP地址),然后检查apikey然后回复。

答案 3 :(得分:0)

  

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

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

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

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