Wcf 如何使用用户名/密码+;SSL

Wcf 如何使用用户名/密码+;SSL,wcf,web-services,security,rest,Wcf,Web Services,Security,Rest,我希望编写一个配置文件,允许在WCF中使用RESTful服务,但我仍然希望能够“点击”成员资格提供者进行用户名/密码身份验证 下面是我当前使用basicHttp绑定或WSHTTPW/out WS-Security配置的一部分,这将如何更改基于REST的服务 <bindings> <wsHttpBinding> <binding name="wsHttp"> <security

我希望编写一个配置文件,允许在WCF中使用RESTful服务,但我仍然希望能够“点击”成员资格提供者进行用户名/密码身份验证

下面是我当前使用basicHttp绑定或WSHTTPW/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>

在你们继续为通过WCF实现REST而奋斗之前,我建议你们阅读Tim Ewald的文章。我尤其受到以下陈述的影响:

我不确定我是否想建立在 设计用于将HTTP考虑在内的层 设计用于 把它算出来


在过去的12个月里,我一直在用WCF开发基于REST的东西,这句话一次又一次地被证明是正确的。我认为WCF带来的好处被它为REST工作引入的复杂性所抵消。

我同意Darrel的观点,WCF上复杂的REST场景是个坏主意。只是不太好看

然而,多米尼克·拜尔(Dominick Baier)在其最不受欢迎的博客上对此有所了解


如果您想在WCF上看到WSSE身份验证支持和回退到FormsAuthenticationTicket支持,请查看。

这里是一个关于使用ASP.net成员资格提供程序保护WCF REST服务的播客:


无论社区是否对WCF上的REST有意见(我个人持反对意见),微软已经对其进行了抨击,

是的,Moto同意,WCF初学者工具包的链接是我所看到的最接近使用自定义HTTP头进行凭证认证的内容()


然而,我无法让这个例子继续下去。

试试看

更新01/23/2012

自从我写了这个问题以来,我看到了一种更好的方法来保护REST,就像在野外保护web服务一样。当我第一次听说它的时候,它听起来很复杂,但是它的想法很简单,而且在整个web上都适用于web服务和其他安全通信

它需要使用公钥/私钥

1.)端点的每个用户(客户)都需要向REST web服务注册

  • a、 )您为该用户提供了一个不应与共享的私钥 任何人
  • b、 )您还可以生成一个可以通过网络传输的公钥 如果需要,以纯文本显示(这也将用于识别客户)
2.)来自用户的每个请求都需要生成一个哈希来签署请求

  • a、 )这方面的一个例子可能是:私钥+时间戳+编码的有效负载(例如,如果足够小,像一个简单的用户信息需要更新)
  • b、 )取这3个(或您决定的任何内容)并生成一个单向散列(例如使用hmac)
  • c、 )在通过网络发送的请求中,包括公钥(以便服务器端知道谁在试图发送此请求)、生成的哈希值(包含私钥)和时间戳
3.)服务器端点(您的REST方法)将需要使用客户端上使用的相同输入生成哈希。此步骤将证明客户端和服务器都知道一个私钥,该私钥与随请求传递的公钥相匹配。(这反过来意味着发送请求的用户是合法的,因为没有其他人知道私钥)

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

  • b、 )将其他参数(时间戳和编码的有效负载)与上一步中找到的私钥一起使用,并使用相同的算法生成单向散列(同样,hmac是我在现实世界中看到的)

  • c、 )生成的单向散列需要与通过线路发送的散列相匹配,如果不发送回400(或任何您认为是“错误请求”的http代码)

我很高兴知道我不是唯一一个注意到这一点的人!WCF有很多优点,但其余的支持给我带来了不少麻烦。WCF是为了排除HTTP而设计的吗?HTTP仅仅是传输选项之一。HTTP是一种用于分布式应用程序的协议。WCF旨在允许您以与协议无关的方式构建分发应用程序。@pc1oad1etter HTTP不是传输协议。HTTP代表超文本传输协议。我认为这是一个相关的问题,我希望看到更多关于这个主题的答案,因为我目前正在寻找同样的问题。REST是一种风格和设计选择,不应该无法应对身份验证。