【问题标题】:WCF custom userName authentication using HTTP使用 HTTP 的 WCF 自定义用户名身份验证
【发布时间】:2012-10-10 21:04:11
【问题描述】:

我正在尝试将我的 WCF 服务配置为通过 HTTP 和我的 ASP.NET 开发服务器使用自定义用户名验证器。以下是 serviceModel 的各个部分...

<basicHttpBinding>
    <binding name="Authentication" >
      <security mode="TransportCredentialOnly" >
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
</basicHttpBinding>

  <service behaviorConfiguration="ApiBehavior" name="CriticalWatch.AuthenticationAPI.AuthenticationAPI">
    <endpoint address="/" binding="basicHttpBinding" bindingConfiguration="AuthenticationBinding" name="Authentication" contract="CriticalWatch.AuthenticationAPI.IAuthenticationAPI" />
  </service>

然后我对验证器有一个行为...

  <serviceBehaviors>
    <behavior name="ApiBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Service.CustomUserNameValidator, MyService" />
      </serviceCredentials>

    </behavior>
  </serviceBehaviors>

我的 CustomUserNameValidator 继承自 UserNamePasswordValidator。验证器类被实例化,但从未调用 Validate 方法。另外,客户端可以在不传递任何用户名和密码的情况下调用该方法。

我错过了什么?

此时,我想要一个不需要 HTTPS 的解决方案。我想依赖随消息传递的用户名和密码。

【问题讨论】:

  • 我刚刚发现这篇帖子,stackoverflow.com/questions/8259724/…,听起来很相似,但又有些不同。它指的是 HTTPS 和 IIS,而我是 HTTP 和 Dev Server。虽然,我希望它也能在 IIS 下工作,所以这可能适用。需要试验,对此有何想法?

标签: http security wcf


【解决方案1】:

另外,请参阅我的博客文章,了解如何实现一个绑定,允许您在不使用 SSL 的情况下通过 HTTP 传递用户名和密码:http://blog.tonysneed.com/2012/06/18/building-scalable-and-secure-wcf-services/ 但是请记住,明文传递凭据不是一个好主意非安全传输。我描述的技术假设您正在使用另一种机制(例如 IPSec)来保护传输,并且它对于支持 SSL 终止以获得更好的可扩展性的负载平衡器很有用。

为了具体解决您的方案,我建议您咬紧牙关,使用 SSL 设置您的开发环境,以便您可以将 HTTPS 绑定与 WCF 和您的用户名密码验证器一起使用。这比实现自定义绑定元素要容易得多,也没有您想象的那么困难。事实上,如果您安装了 IIS Express,您将获得一个自签名证书,您可以轻松地将其用作 IIS 或 Windows 服务上的证书。

干杯, 托尼·斯尼德

【讨论】:

    【解决方案2】:

    默认情况下,WCF 框架不允许通过 HTTP 通道传输用户名/密码作为其明文和安全违规,因此当您切换到 HTTPS 时,用户名/密码验证器会起作用。如果您想让用户名/密码验证器在 HTTP 上工作,您可能需要编写执行此操作的自定义服务主机工厂。你可以找到一个很久以前就在这里了,叫做ClearUserNameBinding。它允许您通过 HTTP 执行用户名/密码验证。

    注意:如前所述,出于安全考虑,不建议在 HTTP 上使用用户名/密码,但如果您确定您的服务位于足够安全的防火墙之后,并且从客户端到防火墙的调用是安全的,那么用户名/password 没有泄露,你可以使用它

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-30
        • 2010-09-16
        • 2011-10-23
        • 2011-04-12
        • 2012-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多