Проверка подлинности запроса веб-службы - PullRequest
2 голосов
/ 20 мая 2009

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

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

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

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

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

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

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

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

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

 <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 ]

6 голосов
/ 30 марта 2011

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

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

Если вы хотите проследить мой прогресс до решения, вы найдете его в StackOverflow под названием « Ошибка в клиенте WCF, использующем веб-сервис Axis 2 с WS-Security Имя пользователяToken PasswordDigest схема »:

1 голос
/ 20 мая 2009
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) *

1 голос
/ 20 мая 2009

Я добился подобного, используя обычный 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);
}

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

...