我正在寫一個WCF服務與一些身份驗證和自定義錯誤處理程序。然而,我正在解決這個問題:當身份驗證拋出異常時,我的IErrorHandler
的實現沒有受到影響,但是在其他解釋中運行得很好。WCF - IErrorHandler與身份驗證
在IErrorHandler
構建之前,驗證是否運行?我是否咆哮着錯誤的樹,試圖去捕捉這些錯誤?
是的,我已經嘗試(和我)在我的身份驗證中投擲FaultException
,而不是SecurityTokenException
。
我正在寫一個WCF服務與一些身份驗證和自定義錯誤處理程序。然而,我正在解決這個問題:當身份驗證拋出異常時,我的IErrorHandler
的實現沒有受到影響,但是在其他解釋中運行得很好。WCF - IErrorHandler與身份驗證
在IErrorHandler
構建之前,驗證是否運行?我是否咆哮着錯誤的樹,試圖去捕捉這些錯誤?
是的,我已經嘗試(和我)在我的身份驗證中投擲FaultException
,而不是SecurityTokenException
。
所以首先要確保您的自定義錯誤處理程序也實現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」的文章。
如果您需要記錄失敗的認證嘗試,您可能需要將其直接放入您的自定義驗證器中。