具有 basicHttpBinding、传输安全性和基本客户端凭据类型的自定义 WCF 凭据验证器

Posted

技术标签:

【中文标题】具有 basicHttpBinding、传输安全性和基本客户端凭据类型的自定义 WCF 凭据验证器【英文标题】:Custom WCF credential validator with basicHttpBinding, Transport security, and Basic client credential type 【发布时间】:2020-07-20 16:21:52 【问题描述】:

我一直在阅读 WCF 配置文档,希望确认我遇到的限制。

我有一个需要以下绑定配置的客户端:

<bindings>
  <basicHttpBinding>
    <binding name="secureHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="Basic"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

在服务器端,我实现了一个自定义用户名和密码验证器,因为我们不为客户端使用 Windows 或域帐户。我遵循了本指南:https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-use-a-custom-user-name-and-password-validator,但他们和我见过的其他示例使用 wsHttpBinding 或添加消息安全性。

服务器端点和行为如下所示:

<services>
  <service name="MyWcfService.Service" behaviorConfiguration="MyBehavior">
    <endpoint
      address=""
      binding="basicHttpBinding"
      bindingConfiguration="secureHttpBinding"
      contract="MyWcfService.IService"/>
    <endpoint
      address="mex"
      binding="mexHttpsBinding"
      contract="IMetadataExchange"/>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="MyBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <serviceCredentials>
        <userNameAuthentication
          userNamePasswordValidationMode="Custom" 
          customUserNamePasswordValidatorType="MyValidator, MyWcfService"/>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

在启用基本身份验证的 IIS 中托管服务时,未命中自定义验证器,IIS 会尝试针对 Windows 帐户验证提供的凭据,如果用户帐户不存在,则会失败并显示此消息:

HTTP 请求未经客户端身份验证方案“基本”授权。

那么,对于托管在 IIS 中的具有 basicHttpBinding、传输安全模式和基本传输客户端凭据类型的服务,是否不可能拥有自定义凭据验证器?有没有办法覆盖 IIS 所做的基本 Windows 身份验证?

【问题讨论】:

【参考方案1】:

我们应该使用UserName 身份验证而不是基本身份验证,随后,我们可以为该服务使用自定义凭据验证器。

  <basicHttpBinding>
     <binding name="mybinding">
       <security mode="TransportWithMessageCredential">
         <message clientCredentialType="UserName"/>
       </security>
     </binding>
   </basicHttpBinding>

 <serviceCredentials>
        <userNameAuthentication customUserNamePasswordValidatorType="WcfService3.CustUserNamePasswordVal,WcfService3" userNamePasswordValidationMode="Custom"/>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

详情How to add user/pass authentication in WCF 如果有什么我可以帮忙的,请随时告诉我。

【讨论】:

当然,它是这样工作的,但我的问题是它是否可以使用 Basic。 据我所知,Basic authentication总是使用windows本地账户或AD账户对客户端进行认证。【参考方案2】:

到目前为止,似乎无法在此绑定配置中使用自定义凭据验证器。

<basicHttpBinding>
<binding name="secureHttpBinding">
  <security mode="Transport">
    <transport clientCredentialType="Basic"/>
  </security>
</binding>

【讨论】:

以上是关于具有 basicHttpBinding、传输安全性和基本客户端凭据类型的自定义 WCF 凭据验证器的主要内容,如果未能解决你的问题,请参考以下文章

WCF--找不到具有绑定 BasicHttpBinding 的终结点的与方案 https 匹配的基址。注册的基址方案是 [http]。

Visual Studio Mac Streaming BasicHttpBinding不起作用

WCF 与 basicHttpBinding、加密、签名和 usernameToken over HTTP

如何在 IIS 中将 WCF 与 basichttpbinding only 、 SSL 和 Basic Authentication 一起使用?

WCF 流式传输错误(最大邮件大小配额)

WCF流式传输时间