2011-12-21 52 views
3

我要通过我的web.config,有没有问题迷上了一个UserNamePasswordValidator WCF服务。在我的验证器中,我重写了Validate,检查凭据并在必要时抛出FaultException。UserNamePasswordValidator可以抛出MessageSecurityException之外的其他东西吗?

实施例:

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上快速搜索会产生各种问题,包括服务器/客户端时间同步...)并不是特别描述性的,并且由于第三方将使用该服务,我想尽可能清楚。

回答

3

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

我们不得不但是给客户知道究竟发生了什么 - 1.错误的用户名/密码 2.密码过期,变化所需 3.其他自定义应用程序特定状态

所以我们改变了CredentialValidator逻辑在它抛出的异常只有在情况1。在其他情况下,它实际上允许被称为真正的WCF方法,但我们还要检查密码过期等,并在一些问题的情况下的方式抛出的FaultException已经从方法体。

在我们的情况下,这很适合于只服务,这种类型的验证是登录服务 - 这样的客户总是知道到底为什么他没有被验证。

+0

我不需要向客户端提供有关验证失败的详细信息,所以我想我会继续从我的验证器中抛出faultexception。 – diggingforfire 2011-12-26 11:51:02

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")); 
+1

-1:不起作用。 – 2012-09-13 10:22:53

+0

到上述方法的行为是一个MessageSecurityException捕捉与所述的InnerException与所述消息和Fault代码集的FaultException。 – 2012-12-17 15:17:27

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")); 
    } 
} 
+0

这对我有效! – cableload 2013-04-16 21:15:34

+0

如果你只是抛出一个故障异常,这是你回来的。 OP想要传回一个自定义错误(例如Fault )。 – 2013-09-03 17:57:57

+0

- DRAirey1 - 所以这对他不起作用, 抛出新的MessageSecurityException(“Userid或Password is invalid”,new Fault (“Userid或Password is invalid”)); – Stix 2015-11-18 20:09:26

相关问题