Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПвИ / Конспект лекций.doc
Скачиваний:
224
Добавлен:
01.06.2015
Размер:
1.05 Mб
Скачать

Подписи

В инфраструктуре WSE имеется возможность потребовать наличие подписи в SOAP-сообщениях. Метод CheckForSignature проверяет наличие в сообщении подписи (MessageSignature):

public static bool CheckForSignature(SoapContext context)

{

if(context == null)

throw new Exception("Only SOAP requests are permited !");

bool foundSignature = false;

foreach(ISecurityElement se in context.Security.Elements)

if(se is MessageSignature)

foundSignature = true;

return foundSignature;

}

Замечание: Наличие элемента MessageSignature означает, что хотя бы одна из частей сообщения подписана.

Вызов метода осуществляется на стороне Web-сервиса перед проверкой маркера безопасности:

public string GetUserName()

{

SoapContext ctxt = RequestSoapContext.Current;

if(ctxt == null)

return "NULL pointer to Service RequestSoapContext or NON-SOAP request";

if(!CheckForSignature(ctxt))

return "SOAP message signature not found !";

Клиентское приложение перед вызовом метода Web-сервиса добавляет подпись в тело сообщения:

UsernameToken userToken =

new UsernameToken(TextBox1.Text, TextBox2.Text,

PasswordOption.SendHashed );

if(userToken == null)

{

Label2.Text = "userToken failed !";

return;

}

MessageSignature sig = new MessageSignature(userToken);

if(sig == null)

{

Label2.Text = "Signature Failed !";

return; }

Одна из проблем, возникающая при использовании подписей, заключается в снижении стойкости подписи при каждом очередном вызове Web-метода. Повторное создание подписей с одинаковым ключом является достаточно серьезной уязвимостью. Преодоление рассмотренной проблемы возможно добавлением случайных величин в подпись маркера безопасности перед отправкой на сторону Web-сервиса:

....

DerivedKeyToken dk = new DerivedKeyToken(userToken);

MessageSignature sig = new MessageSignature(dk);

...

ctxt.Security.Tokens.Add(userToken);

ctxt.Security.Tokens.Add(dk);

ctxt.Security.Elements.Add(sig);

Шифрование

Еще одной особенностью инфраструктуры WSE является возможность шифрования передаваемых данных. Шифрование препятствует раскрытию конфиденциальных данных и гарантирует неразглашение секретных данных. Метод ChechForEncription проверяет на стороне Web-сервиса наличие в сообщении зашифрованных данных:

public static bool CheckForEncription(SoapContext context)

{

if(context == null)

throw new Exception("Only SOAP requests are permited !");

bool foundEncription = false;

foreach(ISecurityElement se in context.Security.Elements)

if(se is EncryptedData)

foundEncription = true;

return foundEncription;

}

На стороне Web-сервиса перед проверкой маркера безопасности выполняется вызов метода ChechForEncription:

SoapContext ctxt = RequestSoapContext.Current;

if(ctxt == null)

return "NULL pointer to Service RequestSoapContext or NON-SOAP request";

if(!CheckForSignature(ctxt))

return "SOAP message signature not found !";

if(!CheckForEncription(ctxt))

return "Encription data not found !";

Шифрование данных в клиентском приложении может быть реализовано следующим образом:

....

DerivedKeyToken dke = new DerivedKeyToken(userToken);

if(dke == null)

{

Label2.Text = "DerivedKeyToken for encription failed !";

return;

}

EncryptedData enc = new EncryptedData(dke);

if(enc == null)

{

Label2.Text = "Encription failed !";

return;

}

....

ctxt.Security.Tokens.Add(userToken);

ctxt.Security.Tokens.Add(dk);

ctxt.Security.Elements.Add(sig);

ctxt.Security.Tokens.Add(dke);

ctxt.Security.Elements.Add(enc);

Соседние файлы в папке ПвИ