RESTful WCF 4 服务中移动客户端的用户身份验证

Posted

技术标签:

【中文标题】RESTful WCF 4 服务中移动客户端的用户身份验证【英文标题】:User authentication for mobile clients in RESTful WCF 4 service 【发布时间】:2011-11-27 04:05:32 【问题描述】:

我正在尝试开发一个供移动客户端(目前为 ios 客户端)使用的 Web 服务,我了解到 RESTful 服务比 SOAP 服务更轻量,所以我想尝试一下.

大多数方法都需要身份验证,但我不确定如何处理,因为我读到 REST 应该是无状态的,所以我如何验证从 iOS 访问服务的用户,然后使用该身份验证来验证连续调用其他网络方法?

注意:我将在 IIS 上使用 WCF 4's WebHttp。

谢谢!

【问题讨论】:

是的,我将托管在 IIS 上。 【参考方案1】:

有许多相当成熟的模式可以做到这一点。

最简单的方法是提供 username:password 作为授权标头或请求的一部分(查询字符串/表单数据)。这将要求您在每次调用时对用户进行身份验证/授权。也许不适合你,但如果你使用 WebHttp(如果你不是这个意思,我会认真看看WCF Web Api),在 WCF 中构建一个 HttpModule 或其他东西会相当容易通道堆栈拦截调用并验证用户。 一种非常常见的方法是公开一个接受用户:密码并生成 API 令牌的端点。然后,用户获取该 API 令牌并使用它来验证后续调用。该令牌可以是任何东西,从弱加密数据到由共享密钥、HTTP 动词、请求的资源等组成的散列。如果你用谷歌搜索“HMAC 身份验证”,你会发现几个例子。 Azure's authentication schemes 是一个非常精细的令牌示例。这种方法的好处是您有一个端点负责身份验证和构建令牌,而您的其他端点只需要知道如何验证哈希或解密令牌;很好的关注点分离。 如果您希望 API 的使用者是第三方应用程序,OAuth/OAuth2 几乎是事实上的标准。

【讨论】:

【参考方案2】:

我建议使用类似于 OAuth 的策略。您将专门编写一项服务来验证凭据并分发访问令牌,并且对您的 API 的任何请求都需要有效的访问令牌。

如果您在 IIS 中托管,我在使用 HttpModule 检查所有传入请求以获取有效令牌之前已完成此操作。如果没有,模块只是以 401 Unauthorized Http 状态码结束请求。

编辑:

如果您想在每个操作的基础上进行更细粒度的授权,我建议您使用自定义授权策略。查看http://msdn.microsoft.com/en-us/library/ms731181.aspx了解更多详情。

【讨论】:

以上是关于RESTful WCF 4 服务中移动客户端的用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章

在负载平衡情况下使用 WCF 4.5 RemoteEndpointMessageProperty 获取客户端 IP 地址

我是不是正确设计了这个 WCF RESTful 接口?

WCF RESTFul服务中的异常处理

带有参数的 Wcf Restful 服务发布用户名

WCF Restful Web 服务客户端限制

使用 WCF 客户端访问 RESTful 服务时访问 HTTP 状态代码