UserNamePasswordValidator除了抛出MessageSecurityException之外,还能抛出

本文关键字:之外 MessageSecurityException UserNamePasswordValidator | 更新日期: 2023-09-27 18:18:37

我有一个WCF服务通过我的web连接到UserNamePasswordValidator。配置,没有问题。在我的验证器中,我覆盖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");
        }
    }
}

如果我自己在。net应用程序中使用此服务并提供无效凭据,则抛出MessageSecurityException并带有以下消息:

"从另一方收到不安全或不正确安全的故障。故障代码和详细信息请参见内部FaultException。"

我所期望的FaultException是MessageSecurityException的InnerException。

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

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

UserNamePasswordValidator除了抛出MessageSecurityException之外,还能抛出

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

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

因此,我们更改了CredentialValidator逻辑,使其仅在情况1时抛出异常。在其他情况下,它实际上允许调用真正的WCF方法,但是在那里我们也会检查密码过期等,如果出现一些问题,就会从方法体抛出FaultException。

在我们的例子中,只有具有这种类型验证的服务是登录服务,所以客户端总是知道为什么他没有被验证。

从自定义密码验证器中,您可以返回描述错误的FaultCode:

throw new FaultException("Invalid user name or bad password.", new FaultCode("BadUserNameOrPassword"));
throw new FaultException("Password expired.", new FaultCode("PasswordExpired"));
throw new FaultException("Internal service error.", new FaultCode("InternalError"));

抛出错误作为MessageSecurityException,内部异常作为FaultException

public override void Validate(string userName, string password)
{
    var isValid = ValidateUser(userName, password);
    if (!isValid)
    {
        throw new MessageSecurityException("Userid or Password is invalid", new FaultException("Userid or Password is invalid"));
    }
}