使用自定义用户名密码验证程序通过 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>
我最终通过实现serviceAuthorization
来解决这个难题。根据下面的博客文章,进行了一些调整以匹配我的应用程序。
http://www.allenconway.net/2012/07/using-basic-authentication-in-rest.html