Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Купцевич Ю.Е. -> "Альманах программиста, том 4. Безопасность в Microsoft .NET" -> 72

Альманах программиста, том 4. Безопасность в Microsoft .NET - Купцевич Ю.Е.

Купцевич Ю.Е. Альманах программиста, том 4. Безопасность в Microsoft .NET — М.: Русская редакция, 2004. — 304 c.
ISBN 5-7502-0184-8
Скачать (прямая ссылка): almanahprogrammista2004.pdf
Предыдущая << 1 .. 66 67 68 69 70 71 < 72 > 73 74 75 76 77 78 .. 108 >> Следующая


reqEnv.Save(InStreara);

iflStream.Position=^;

>

else

{ ¦ '¦ 4 гецЕпу. Save{ inStrearn);

і .,

Далее SOAP-конверт подписывается. Для этого он передается методу Get-Xml объекта защиты. GetXmI возвращает элемент WS-Security Header, добавляемый в заголовок SOAP-конверта. Наконец, новое SOAP-сообщение сохраняется в исходящем потоке. Детали см. в исходном коде на рис. 6.

Асинхронная реализация этих операций не так уж сильно отличается от синхронной. В AsyncProcessRequest текущий приемник помещается в стек
Защита SOAP-пакетов на основе WS-Security и приемников каналов Remoting

207

приемников, чтобы этот приемник вызывался при асинхронной обработке ответа. Никакой последующей обработки сообщения не требуется; вместо этого вызов просто передается очередному приемнику.

Реализация серверного приемника канала

Реализация ServerChannelSinkProvider аналогична реализации клиентского провайдера. Вы передаете ссылку на объект канала, необходимый для реализации приемника. В настоящее время серверные приемники не поддерживают асинхронную обработку запроса. Однако возможна асинхронная обработка ответа. Поэтому достаточно реализовать только методы Process Message и AsyncProcessResponse, В данной реализации приемника канала ответ сервера не обрабатывается, а просто передается дальше по цепочке. Поэтому реализация метода GetResponseStream всего лишь делегирует вызов следующему приемнику в стеке приемников для дальнейшей обработки. Обработка метода AsyncProcessResponse тоже тривиальна — и в этом случае вызов просто делегируется следующему приемнику в стеке.

В методе ProcessMessage вы должны сначала убедиться, что метод еще не десериализован. Затем создать SOAP-конверт для потока, передаваемого в качестве параметра, а из SOAP-сообщения извлечь заголовки WS-Security. Создавая объект защиты из XML-кода каждого из заголовков, вы проверяете подпись.

При WSE'o6pa6oTKe вызывается объект, реализующий интерфейс IPass-wordProvider. Этот объект считывает пароль, соответствующий имени пользователя, которое содержится в заголовке. Конкретный объект, реализующий IPasswordProvider, задается в файле конфигурации WSE в разделе <microsoft.web.services> ... <passwordProvider>. Чтобы получить дополнительную информацию, изучите файлы конфигурации в примере кода к статье. Кроме того, перед дальнейшей передачей сообщения по цепочке приемников следует удалять заголовки Security из SOAP-сообщения (рис. 7).

В приемниках каналов на стороне сервера очень важно обрабатывать исключения; сгенерированное исключение передается обратно до транспортного приемника, который обрабатывает его и завершает соединение. Необходимо обработать исключение и возвратить соответствующее сообщение SOAP Fault с нужными кодами HTTP-ошибки. Для изменения кодов HTTP-ответа используются ключи транспортного заголовка HttpSta-tusCode и____HttpReasonPhrase.
208

Защита кода и данных

Рис. 7, Обработка элементов защиты

SoapEnvelope reqEnv = new SoapEnvelopeO; ;

reqEnv. Load(requestStreaft); ^

// Обрабатываем несколько зпементоа защиты ;д

XalKodeList nodelist;

IBtumerator nodelistEnuns;

nodelist = reqEnv. Header. GetEle*ieritsByTagN6ira{e”Security". i,,

§''http: //scheaas. xslsoap, о rg/ws/2G02/07/secext"); :

nodal istEnum = nodal ist. GetEnumeratorO;

ArrayListnodestodelete = new ArrayListO; .

try

{ s

wftile( nodelistEmim. MoveNext<))

{ : і-

XmlElement elem = nodelist EnufR.Current as XmlEleaent;

// C03ДА EM объект защиты

Security secserver * new Security(elem);

// He иожен удалить узел, так как список изменится,

// поэтому запоминаем узеп :

nodestodelete.Add(elem);

)

fj удаляем узлы зацита из заголовка

IEnumerator nodestodeIeteEnuin = nodestodelete. QetEnuseratorQ; whilet nodestodeltfteEnufi. MoveHextO)

{

reqEnv. Header. ReBioveChildf (

XmlElement)nodestodeleteEnиш.Cur rent);

} ¦ HewryStream Strm - new MemoryStreareO I reqEnv.Save(Strm); str®,Position=O;

processing * „nextSink. Proces{iMessa:fle(sinkStack, null, cequestHeadars, strm, out responaeMsg, out responseHeaders, out FesponseStrearn);

і

В обработчике исключения создается соответствующее исключению сообщение SOAP Fault, которое сери ал изуется в поток ответа; при этом задаются нужные HTTP-заголовки со сведениями об ошибке на серверной стороне. Если используется TCP-канал, обратно передается лишь сообщение SOAP Fault, а заголовки не устанавливаются.
Защита SOAP-пакетов на основе WS-Security и приемников каналов Remoting 209

Расширение реализации

Одно из возможных расширений этого приемника — реализация эквивалента олицетворения (impersonation), или подмены. Когда подпись проверяется на сервере, на этой стороне имеется допустимый объект защиты, из которого можно получить маркер UserName:

SecurityTokenCollection col = reqCtx.Security.Tokens;

IEnumerator e = col.GetEnumeratorO;

e.MoveNextO; // ожидаем только один маркер

ItsernameToken tokn = (UsernameToken) е.Current; string username = tokn.Username;
Предыдущая << 1 .. 66 67 68 69 70 71 < 72 > 73 74 75 76 77 78 .. 108 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100