WCF - Как вызвать Message Inspector перед диспетчером авторизации службы?

63
7

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

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

a) BeforeSendRequest (сторона клиента). Этот метод используется для настройки заголовка сообщения 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;
}

b) AfterReceiveRequest (сторона сервера). Этот метод используется для извлечения настроенного сообщения 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;
}

Теперь, когда запрос выполняется с клиентской стороны, первый вызов выполняется в классе Custom Authorization Manager вместо параметра 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>

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

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

спросил(а) 2021-01-25T15:59:45+03:00 5 месяцев назад
1
Решение
132

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

ответил(а) 2021-01-25T15:59:45+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема