2011-08-08 135 views
1

我正在寫一個WCF服務與一些身份驗證和自定義錯誤處理程序。然而,我正在解決這個問題:當身份驗證拋出異常時,我的IErrorHandler的實現沒有受到影響,但是在其他解釋中運行得很好。WCF - IErrorHandler與身份驗證

IErrorHandler構建之前,驗證是否運行?我是否咆哮着錯誤的樹,試圖去捕捉這些錯誤?

是的,我已經嘗試(和我)在我的身份驗證中投擲FaultException,而不是SecurityTokenException

回答

1

所以首先要確保您的自定義錯誤處理程序也實現IServiceBehavior。 IServiceBehavior要求您實現一些其他方法,但重要的方法是「ApplyDispatchBehavior」,您必須在其中將ErrorHandler添加到通道調度程序。

C#

public class CustomErrorHandler: IServiceBehavior, IErrorHandler 
{ 
    public bool HandleError(Exception error) 
    { 
     //Return True here if you want the service to continue on as if 
     // the error was handled 

     return true; 
    } 

    public void ProvideFault(Exception error, 
          MessageVersion version, 
          ref Message fault) 
    { 
     FaultException fe = new FaultException(
      new FaultReason(error.Message), 
      new FaultCode("Service Error")); 

     MessageFault mf = fe.CreateMessageFault(); 
     fault = Message.CreateMessage(version, mf, fe.Action); 
    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, 
             ServiceHostBase serviceHostBase) 
    { 

     IErrorHandler eh = new CustomErrorHandler(); 

     foreach (ChannelDsipatcherBase cdb in serviceHostBase.ChannelDispatchers) 
     { 
      ChannelDispatcher cd = cdb as ChannelDispatcher; 
      cd.ErrorHandlers.Add(eh); 
     } 

    } 

    public void AddBindingParameters(ServiceDescription serviceDescription, 
            ServiceHostBase serviceHostBase, 
            Collection<ServiceEndpoint> endpoints, 
            BindingParameterCollection bindingParameters) 
    { 
     //Add binding parameters if you want, I am not 
    } 

    public void Validate(ServiceDescription serviceDescription, 
         ServiceHostBase serviceHostBase) 
    { 
     //Add custom fault validation here if you want 
    } 
} 

然後,你需要將CustomErrorHandler添加爲服務行爲,並添加行爲

的web.config

<system.serviceModel> 
    <extensions> 
     <behaviorExtensions> 
      <add name="ErrorHandler" 
       type="ServiceNamespace.CustomErrorHandler, ServiceNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
     </behaviorExtensions> 
    </extensions> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyBehavior1"> 
       <!--Put other behaviors for your service here then add the next line--> 
       <ErrorHandler /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

這樣,你的所有拋出的異常將被轉換將故障返回給客戶端。

對於SecurityTokenExceptions,您不希望立即將它們轉換爲Fault Exceptions。實際上,您希望在自定義驗證中將其作爲SecurityTokenExceptions引發,以便服務/服務器識別安全授權失敗,並自動返回爲「403:拒絕訪問」的錯誤。我不是100%,但我認爲自定義驗證和驗證片段在加載自定義服務行爲(如錯誤處理程序)之前發生。不幸的是,如果您需要對auth中的某些內容進行疑難解答,則需要在該服務上啓用WCF跟蹤,請參閱本文標題爲「How to turn on WCF Tracing」的文章。

如果您需要記錄失敗的認證嘗試,您可能需要將其直接放入您的自定義驗證器中。