使用自定义用户名密码验证程序通过 HTTPS 的 WCF 服务 - 如何处理空白用户名和密码

本文关键字:密码 用户 何处理 空白 服务 处理 验证 自定义 程序 HTTPS WCF | 更新日期: 2023-09-27 18:32:04

我有一个WCFservice,它是一个HTTPS REST API,它公开了一些WebGet方法。我正在通过HTTPS使用传输级别安全性。这一切都工作正常。我实现了自定义UserNamePasswordValidator,根据MSDN文档覆盖了Validate方法。

    public override void Validate(string userName, string password)
    {
        WebFaultException rejectEx = new WebFaultException(HttpStatusCode.Unauthorized);
        rejectEx.Data.Add("HttpStatusCode", rejectEx.StatusCode);
        if (null == userName || null == password)
            throw rejectEx;
        if (userName == "someusername" && password == "somepassword") return;
        throw rejectEx;            
    }

仅通过HTTPS在浏览器中访问服务(http已禁用),提示输入用户名和密码,遗漏一个或错误地输入一个或两个会导致提示返回,因为我抛出401。

我遇到的问题是,如果在访问服务时省略了用户名和密码,则永远不会调用Validate。我需要能够处理这个问题并向浏览器/客户端返回一个信息性错误,甚至只是一个 401。

调试显示,在省略用户名和密码时,永远不会触发Validate。这意味着在浏览器中,您最终会得到一个空白页面并且没有错误。

如何处理这种情况并向客户端返回响应,再次提示输入凭据?

编辑以包含配置信息:

<behaviors>
  <serviceBehaviors>
    <behavior name="RESTEndpointBehaviour">
      <serviceMetadata httpsGetEnabled="true" httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="false" />
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom"
                                customUserNamePasswordValidatorType="MyAPI.CustomAuthenticator, MyAPI"
                                />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service behaviorConfiguration="RESTEndpointBehaviour" name="MyAPI.RestService">
    <endpoint binding="webHttpBinding" bindingConfiguration="BasicHttpSSLBinding"
        contract="MyAPI.IRestService" />
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="https://localhost:443" />
      </baseAddresses>
    </host>
  </service>
</services>
<bindings>
  <webHttpBinding>
    <binding name="BasicHttpSSLBinding">
      <security mode="Transport">
        <transport clientCredentialType="Basic"/>
      </security>
    </binding>
  </webHttpBinding>
</bindings>

使用自定义用户名密码验证程序通过 HTTPS 的 WCF 服务 - 如何处理空白用户名和密码

我最终通过实现serviceAuthorization来解决这个难题。根据下面的博客文章,进行了一些调整以匹配我的应用程序。

http://www.allenconway.net/2012/07/using-basic-authentication-in-rest.html