UserNamePasswordValidator可以抛出除MessageSecurityException以外的任何内容吗?

dig*_*ire 5 c# authentication validation wcf fault

我通过web.config连接了一个带有UserNamePasswordValidator的WCF服务,没问题.在我的验证器中,我重写Validate,检查凭据并在必要时抛出FaultException.

例:

public class CredentialValidator : UserNamePasswordValidator
{
    public override void Validate(string userName, string password)
    {
        if (userName != "dummy")
        {
            throw new FaultException<AuthenticationFault>(new AuthenticationFault(), "Invalid credentials supplied");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在.NET应用程序中自己使用此服务并提供无效凭据,则会抛出MessageSecurityException并显示以下消息:

"从另一方收到了一个不安全或不正确安全的故障.请参阅内部FaultException以获取故障代码和详细信息."

我预期的FaultException是MessageSecurityException的InnerException.

有没有办法让客户端只接收FaultException?

MessageSecurityException并不特别描述异常的真正原因(对SO的快速搜索会产生各种问题,包括服务器/客户端时间同步......),并且由于第三方将使用该服务,我希望尽可能清楚.

Max*_*ikh 3

几个月前我遇到了同样的问题,经过一些研究,我得出的结论是,您可以从验证器代码中抛出任何您想要的内容,但客户端仍然会收到 MessageSecurityException,其中根本不包含任何有用的信息。

然而,我们必须让客户知道实际发生了什么 - 1. 用户名/密码错误 2. 密码已过期,需要更改 3. 一些其他自定义应用程序特定状态

因此,我们更改了 CredentialValidator 逻辑,使其仅在情况 1 中抛出异常。在其他情况下,它实际上允许调用真正的 WCF 方法,但我们还会检查密码过期等情况,并且在出现某些问题时抛出异常方法体中已经出现了FaultException。

在我们的例子中,这仅适用于具有这种类型验证的服务(即登录服务)——因此客户端总是知道为什么他没有经过身份验证。