1

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

为了自定义 SOAP 消息,我们重写了两种方法:

a) BeforeSendRequest (Client Side) - 此方法用于在 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;
      }

现在,当从客户端发出请求时,首先在自定义授权管理器类中进行调用,而不是在服务器端的消息检查器中进行 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>

流程应该是从消息检查器到服务器端的自定义授权管理器。但是,在我们的例子中,流程正好相反,即从自定义授权管理器到消息检查器。这可能是由于在 App.config 中注册了自定义授权管理器。

任何人都可以帮助我将流程从消息检查器更改为服务器端的自定义授权管理器吗?

4

1 回答 1

0

我找不到在服务授权管理器之前调用消息检查器的方法,所以我通过CheckAccess(OperationContext operationContext, ref Message message)在服务授权管理器中重新定义方法并在该方法中完成所有工作来解决这个问题。这不是一个很好的解决方案,但它确实有效:)

于 2016-10-24T07:56:24.017 回答