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上快速搜索会产生各种问题,包括服务器/客户端时间同步…),并且由于第三方将使用该服务,我希望尽可能清楚。
几个月前我遇到了同样的问题,经过一些研究,我得出结论,你可以从验证器代码中抛出任何你想要的东西,但客户端仍然会得到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"));
}
}