Проверка подлинности запроса веб-службы
Мы действительно застряли здесь, поэтому я решил попросить вас о помощи.
Вчера меня попросили помочь в использовании веб-службы, получить 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) *