2011-03-23 84 views
4

我调查创造一个现有的asp.net应用程序一个WCF REST服务,通过各种客户端,包括Windows Phone 7的,Android设备,iPhone应用程序等会员/授权通过REST服务

创建一个简单的消耗WCF REST服务和从上述平台上使用它不是问题,并且工作得很好。我正在努力争取我的头脑是授权。

该asp.net应用程序使用成员资格提供程序来提供身份验证和授权,我很乐意从REST服务使用该API。

如何保护我的REST服务,以便第一次调用必须进行身份验证(传递用户名和密码),并且以下调用知道谁已登录。我猜测认证方法将不得不传回某种令牌,以便在随后的调用中识别调用者。这是否足够安全,因为整个站点/服务都通过SSL?

欢迎任何建议。

回答

2

一般来说,令牌方式比每个请求只发送用户名+密码(基本认证)更好。问题是要正确实现:虽然Basic Authentication很容易实现,而实际上它已经被大多数应用程序和Web服务器实现,但令牌是您需要实现的东西 - 它必须被加密,因此客户端赢得了'不了解它,所以你需要一些密钥管理,它也必须有一些到期日期,可能你会想要一些撤销功能。另外,它会让客户的生活变得更加困难:客户端不必为每个请求附加基本的验证头,而必须先到某个验证点,接收一个有效的请求,然后在请求中使用该令牌。如果令牌过期,则客户端需要再次转到认证点。

所以如果你有时间和知识,而你的客户很聪明,最好使用令牌方法。否则,使用SSL,基本认证应该足够了。

+0

我认为我更喜欢令牌方法,而不是在每个请求上发送用户名和密码。我知道这不是严格的RESTful,因为我将不得不维持状态,但在这种情况下,我很乐意接受这种状态。 – DavidGouge 2011-03-24 23:03:02

+0

我看不出为什么你说这个令牌(即,如果我了解你,在cookie中的会话ID)更好。它使你的应用程序有状态,这是绝对不安宁的,让客户的生活更难,不是更安全(比较会话劫持),让服务器的生活变得更难(负载平衡在状态满的应用程序中要困难得多)......你能详细说明你为什么认为它更好? – 2011-03-25 06:59:34

+1

其实我并不是故意将会话ID放入cookie中,而是在头中加入一些加密的令牌。这不会改变REST的无状态特性。因为你不需要在每个请求中发送密码,所以它会降低密码被盗的可能性。它也允许SSO场景:用户已登录到需要调用REST调用的应用程序,因此应用程序使用加密的令牌而不是密码。实际上登录后从未使用密码。 – Tarlog 2011-03-25 09:25:12

4

更平静的认证方案是使用HTTP认证,例如,基本或摘要。由于您的服务已通过SSL,因此Basic应该足够了。验证令牌(登录/密码)随每个请求一起发送,以便服务可以是无状态的。我知道的每个客户端库都可以处理基本身份验证。

+0

谢谢你的回答。 :) – DavidGouge 2011-03-24 23:03:19

0

我见过最新的WP7 Windows Azure工具包中的一个例子,可能对您有所帮助。它基本上使用成员资格提供程序,登录一个人(第一次安装应用程序),然后生成一个工单。然后加密这张票并将其作为一个TOKEN发回,然后将其存储在隔离存储器的手机中。票证的过期设置为int.MaxValue,以便令牌在很长一段时间内保持良好状态。

现在,这个令牌被传递到Authorization Header中的Web Services,在那里它被解密,用户的身份被验证,然后进行Web服务调用。

希望这有助于。我试图解决一个类似的情况,相信我,没有太多的东西指向正确的方向......如果你问我,这是一件相当悲伤的事情。