Проверка подлинности запроса веб-службы

Мы действительно застряли здесь, поэтому я решил попросить вас о помощи.

Вчера меня попросили помочь в использовании веб-службы, получить URL-адрес WSDL и учетные данные пользователя для использования. Я никогда не имел ничего общего с веб-сервисами, но, имея общее представление о них и увидев несколько примеров, я подумал, что это не так уж плохо. Очевидно, я был неправ, потому что я застрял сейчас.

Кажется, все в порядке, прокси-класс (или клиент) сгенерирован, создание запросов и их отправка также хороши, кроме части аутентификации. Что мы не можем понять, как это сделать.

С использованием:

client.ChannelFactory.Credentials.UserName.UserName = "myusername";
client.ChannelFactory.Credentials.UserName.Password = "mypassword";

не похоже на работу. (Когда я проверяю BindingElementCollection, возвращаемую клиентом.Endpoint.Binding.CreateBindingElements(), SecurityBindingElement отсутствует)

Я пробовал так много других способов сделать это, но я думаю, что упускаю что-то простое, и отсутствие документации тоже не помогает.

Итак, вопрос: как мне отправить имя пользователя и пароль при совершении звонка в веб-службу, используя WCF?

Изменить: просто чтобы уточнить, запрос должен содержать что-то похожее на это:

 <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
     <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-25763165">
        <wsse:Username>username</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">1DiaGTkOLk/CZhDaEpbkAaKRfGw=</wsse:Password>
        <wsse:Nonce>6ApOnLn5Aq9KSH46pzzcZA==</wsse:Nonce>
        <wsu:Created>2009-05-13T18:59:23.309Z</wsu:Created>
     </wsse:UsernameToken>
  </wsse:Security>

3 ответа

Решение

У меня такая же проблема. Вместо собственного сериализатора токенов я использовал MessageInspector добавить правильный UsernameToken в BeforeSendRequest метод. Затем я применил собственное поведение, чтобы применить исправление.

Весь процесс задокументирован (с демонстрационным проектом) в моем блоге " Поддержка дайджеста пароля базового профиля WS-I в прокси-клиенте WCF". Кроме того, вы можете просто прочитать PDF.

Если вы хотите проследить мой прогресс до решения, вы найдете его в Stackru под названием " Ошибка в клиенте WCF, использующем веб-службу Axis 2 с WS-Security UsernameToken PasswordDigest схема аутентификации":

Я добился подобного, используя обычный HttpCookie.

Чтобы создать cookie:

[OperationContract]     
public void LoginToApi(string username, string password, string clientName)
{
// authenticate with DB, if successful ...
// construct a cookie
    HttpCookie httpCookie = new HttpCookie("SessionID","whateverneeded");
    HttpContext.Current.Response.SetCookie(httpCookie);
}

Это также появляется в ваших регулярных HttpRequests. Таким образом, вы просто изменяете процесс, проверяя хеш / идентификатор сессии / имя пользователя / пароль, независимо от того, что вы указали в куки при получении, прежде чем что-либо делать.

var factory = new ChannelFactory<IService>('*');
factory.Credentials.UserName.UserName = 'bob';
factory.Credentials.UserName.Password = 'bob';
var proxy = factory.CreateChannel();

Для получения дополнительной информации вы можете изучить авторизацию в службах на основе WCF * ( http://msdn.microsoft.com/en-us/magazine/cc948343.aspx) *

Другие вопросы по тегам