2011-12-21 91 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

相關問題