0

Мы используем Message Inspector для настройки SOAP-сообщения, добавляя некоторую информацию на стороне клиента и извлекая добавленную информацию на стороне сервера. Мы также используем Custom Authorization Manager, используя ServiceAuthorizationManager для использования полученной информации о сообщении на основе SOAP.WCF - Как вызвать Message Inspector перед диспетчером авторизации службы?

Чтобы настроить сообщения SOAP, мы перекрывая два метода:

а) BeforeSendRequest (Client Side) - Этот метод используется для настройки заголовка SOAP сообщения в Message Inspector.

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; 
     } 

б) AfterReceiveRequest (Server Side) - Этот метод используется для извлечения настроенного сообщения SOAP в Message Inspector.

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() в Message Inspector на стороне сервера.

Мы зарегистрировали наш пользовательский диспетчер авторизации в файле 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> 

Поток должен быть от сообщения инспектора пользовательского диспетчера авторизации на стороне сервера. Но в нашем случае поток прямо противоположный, то есть от Custom Authorization Manager до Message Inspector. Это может произойти из-за регистрации диспетчера пользовательской авторизации в App.config.

Может ли кто-нибудь помочь мне изменить поток от Message Inspector до Custom Authorization Manager на стороне сервера?

ответ

0

Я не смог найти способ вызвать Message Inspector перед диспетчером авторизации службы, поэтому я решил эту проблему, переопределив метод CheckAccess(OperationContext operationContext, ref Message message) в диспетчере авторизации служб и выполнив всю работу в этом методе. Это нехорошее решение, но оно работает :)