В качестве выхлопа от прошлых моих статей мы научились проводить аутентификацию клиента по сертификату. Сертификаты – это очень хорошо, но иногда может возникать потребность аутентифицироваться по имени и паролю. Давайте рассмотрим, как это можно сделать. Как всегда, буду говорить про настройку BizTalk Server 2010, но, поскольку он использует WCF-адаптеры, фактически это настройка WCF.
Для аутентификации по имени пользователя и паролю нужно проверить настройки IIS – должен быть установлен тип аутентификации Basic. Проверить можно так:
- Открываем IIS Manager, выбираем нужный нам сайт, переходим в раздел Authentication
- Далее нам нужно убедиться, что тип аутентификации Basic Authentication разрешен:
Если такого типа в списке нет, значит, его нужно установить. Для этого открываем Windows Features (Control Panel\All Control Panel Items\Programs and Features, слева на панели Turn Windows features on or off) и выставляем указанные ниже на картике галочки в секции Internet Information Services \ World Wide Web Services \ Security, после чего нажимаем ОК, ждем когда всё настроится и проверяем IIS:
Итак, разрешили Basic Authentication на сайте в IIS, далее нужно настроить BizTalk. Для этого нужно залесть в BizTalk Server Administration, выбрать приложение, выбрать у него нужный Receive Location (через который клиенты будут ломиться к сервисами BizTalk).
Допустим, у нашего Receive Location выставлен тип WCF-BasicHttp, нажимаем кнопку Configure…
На вкладке Security появившегося окна WCF-BasicHttp Transport Properties выставляем значения комбобоксов так, как на рисунке ниже:
Нажимаем везде OK, закрываем все окна, наш сервис настроен на аутентификацию.
Ну а дальше в клиенте задаем нужные credentials и всё счастливы:
client.ClientCredentials.UserName.UserName = "some_name"; client.ClientCredentials.UserName.Password = "some_psw";
Да, если вдруг начнете ловить ошибку Could not establish trust relationship for the SSL/TLS secure channel with authority, то попробуйте в коде до вызова сервиса прописать строчку
System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);