WCF - 如何在服务授权管理器之前调用Message Inspector?

时间:2016-08-25 09:35:11

标签: wcf authorization request-headers idispatchmessageinspector iclientmessageinspector

我们正在使用Message Inspector通过在客户端添加一些信息并在服务器端检索添加的信息来自定义SOAP消息。 我们还使用自定义授权管理器,使用ServiceAuthorizationManager来使用检索到的基于SOAP的消息信息。

要自定义SOAP消息,我们将覆盖两种方法:

a)BeforeSendRequest(客户端) - 此方法用于在Message Inspector中自定义SOAP消息头。

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
      {
         Dictionary<string,string> headerInfo = new Dictionary<string,string>();

         headerInfo.Add("UserId","1111");

         MessageHeader header = MessageHeader.CreateHeader("LocalName", "NamespaceURI", headerInfo);
         request.Headers.Add(header);

         return null;
      }

b)AfterReceiveRequest(服务器端) - 此方法用于在Message Inspector中获取自定义的SOAP消息。

public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
      {
         Dictionary<string, string> headerInfo = request.Headers.GetHeader<Dictionary<string, string>>("LocalName", "NamespaceURI");
         return null;
      }

现在,当从客户端发出请求时,首先在Custom Authorization Manager类中调用,而不是在Server端的Message Inspector中调用AfterReceiveRequest()。

我们已在App.config文件中注册了自定义授权管理器,如下所示:

<serviceBehaviors>
<behavior name="SampleAuthorizationService.Service1Behavior">
   <serviceMetadata httpGetEnabled="false"/>
   <serviceDebug includeExceptionDetailInFaults="false"/>
   <serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="SampleAuthorizationSecurity.CustomAuthorizationManager, SampleAuthorizationSecurity">
      <authorizationPolicies>
         <add policyType="SampleAuthorizationSecurity.CustomAuthPolicy, SampleAuthorizationSecurity"/>
      </authorizationPolicies>
   </serviceAuthorization>
</behavior>
</serviceBehaviors>

流程应该从Message Inspector到服务器端的Custom Authorization Manager。但是,在我们的例子中,流程正好相反,即从Custom Authorization Manager到Message Inspector。 由于在App.config中注册自定义授权管理器,可能会发生这种情况。

任何人都可以帮我改变从服务器端的Message Inspector到Custom Authorization Manager的流程吗?

1 个答案:

答案 0 :(得分:0)

我无法找到在Service Authorization Manager之前调用Message Inspector的方法,因此我通过在Service Authorization Manager中重新定义方法CheckAccess(OperationContext operationContext, ref Message message)并完成此方法中的所有工作来解决此问题。它不是一个漂亮的解决方案,但它可以完成工作:)