5

我有一个 WCF 服务通过我的 web.config 与 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 的快速搜索会产生各种问题,包括服务器/客户端时间同步..),并且由于第三方将使用该服务,我想尽可能清楚。

4

3 回答 3

3

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

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

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

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

于 2011-12-21T21:50:57.260 回答
1

从自定义密码验证器中,您可以返回描述错误的 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"));
于 2012-07-26T16:51:01.137 回答
0

将错误作为 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"));
    }
}
于 2013-01-25T08:23:44.070 回答