如何使用用户名/密码+ SSL使用WCF配置安全的RESTful服务

时间:2008-09-26 19:40:43

标签: wcf web-services security rest

我正在寻找一个允许在WCF中使用RESTful服务的配置文件,但我仍然希望能够“利用”成员资格提供程序进行用户名/密码身份验证。

以下是使用basicHttp绑定或wsHttp w / out WS Security的当前配置的一部分,这将如何改变基于REST的服务?

    <bindings>
        <wsHttpBinding>
            <binding name="wsHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false"/>
                </security>
            </binding>
        </wsHttpBinding>
        <basicHttpBinding>
            <binding name="basicHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="NorthwindBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>

7 个答案:

答案 0 :(得分:3)

以下是使用ASP.net会员提供商保护WCF REST服务的播客:

http://channel9.msdn.com/posts/rojacobs/endpointtv-Securing-RESTful-services-with-ASPNET-Membership/

答案 1 :(得分:2)

我同意Darrel的观点,即基于WCF的复杂REST场景是一个坏主意。它只是不漂亮。

然而,Dominick Baier在他的最小特权博客上有一些good posts

如果您希望通过回退到WCF上的FormsAuthenticationTicket支持来查看WSSE身份验证支持,请查看source code of BlogService

答案 2 :(得分:1)

在继续沿着WCF实施REST的战斗之前,我建议你阅读Tim Ewald撰写的this帖子。我特别受到以下声明的影响:

  

我不确定我想建立一个   设计用于在HTTP中使用HTTP的层   设计为的图层的顶部   将它排除在外。

在过去的12个月里,我一直在使用WCF开发基于REST的东西,而且这种说法已经证明了自己一遍又一遍如此真实。恕我直言,WCF为表格所带来的复杂性远远超过了它为REST工作所引入的复杂性。

答案 3 :(得分:1)

无论社区是否对WCF 上的REST提出意见(我个人都在围栏中) Microsoft已经对其进行了轻视, http://msdn.microsoft.com/en-us/netframework/cc950529.aspx < / p>

答案 4 :(得分:1)

是的,与Moto达成一致,WCF Starter Kit中的链接是我使用自定义HTTP标头(http://msdn.microsoft.com/en-us/library/dd203052.aspx)验证身份验证时最接近的事情。

但是我无法得到这个例子。

答案 5 :(得分:1)

答案 6 :(得分:1)

更新01/23/2012

自从我写这个问题以来,我已经看到了一种更好的方法来保护REST,就像野外的Web服务一样。当我第一次听到它时听起来很复杂,但这个想法很简单,而且整个网络都提供Web服务和其他安全通信。

它需要使用公钥/私钥。

1。)端点的每个用户(客户)都需要注册您的REST Web服务

  • a。)您为此用户提供了不应与之共享的私钥 任何人
  • b。)您还生成一个可以通过网络的公钥 如果需要,可以使用明文(这也将用于识别客户)

2.)来自用户的每个请求都需要生成一个哈希来签署请求

  • a。)其中一个示例可能如下:私钥+时间戳+编码的有效负载(如果足够小就像一个简单的用户信息,例如要更新)
  • b。)你拿这些3(或你决定的任何东西)并生成1路哈希(例如使用hmac)
  • c。)在通过网络发送的请求中,您包含公钥(因此服务器端知道谁正在尝试发送此请求),使用私钥生成的哈希以及时间戳。 / LI>

3.)服务器端点(您的REST方法)将需要使用客户端上使用的相同输入生成哈希。此步骤将证明客户端和服务器都知道与传递请求一起传递的公钥匹配的私钥。 (这反过来意味着发送请求的用户是合法的,因为没有其他人可以知道私钥)

  • a。)通过在请求期间传递的公钥查找客户私钥

  • b。)获取其他参数(时间戳和编码的有效负载)以及您在上一步中找到的私钥,并使用相同的算法生成1路哈希(再次hmac是我的看到在现实世界中使用过)

  • c。)生成的1路哈希需要匹配通过线路发送的哈希,如果不发回400(或任何你认为是“错误请求”的http代码)