Как получить WCF для отправки пароля в дайджест-режиме при использовании привязки UserNameOverTransport?(Преобразование кода WSE3.0 в WCF) - PullRequest
4 голосов
/ 05 августа 2011

Я пытаюсь преобразовать этот код WSE3.0 в WCF:

// we use Microsoft WSE 3.0 to insert the username token in the soap header.
// This strategy takes care of creating and inserting the Nonce and Created elements 
// for us, as well as creating a password digest based on Nonce, Created, and 
// the password itself.  Refer to the WS-Secutiry UsernameToken Profile 1.1
// specification at http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wss.

Microsoft.Web.Services3.Security.Tokens.UsernameToken nametoken;
nametoken = new Microsoft.Web.Services3.Security.Tokens.UsernameToken(username, password, Microsoft.Web.Services3.Security.Tokens.PasswordOption.SendHashed);
Microsoft.Web.Services3.Design.Policy ClientPolicy = new Microsoft.Web.Services3.Design.Policy();

ClientPolicy.Assertions.Add(new UsernameOverTransportAssertion());
this._proxy.SetPolicy(ClientPolicy);
this._proxy.SetClientCredential<UsernameToken>(nametoken);

Я подошел довольно близко, за исключением отправки пароля в режиме дайджеста (Microsoft.Web.Services3.Security.Tokens.PasswordOption.SendHashed в приведенном выше коде`):

TransportSecurityBindingElement transportBindingElement =
    SecurityBindingElement.CreateUserNameOverTransportBindingElement();
transportBindingElement.AllowInsecureTransport = true;
transportBindingElement.EnableUnsecuredResponse = true;
transportBindingElement.IncludeTimestamp = true;
var binding = new CustomBinding(new BindingElement[] { //
    transportBindingElement, //
    new TextMessageEncodingBindingElement() {
        MessageVersion = MessageVersion.Soap11
    }, //
    new HttpTransportBindingElement() {
        AuthenticationScheme = AuthenticationSchemes.Digest,
    }, //
});

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

Точно ли это утверждение?

Если это так, что мне нужно сделать, чтобы создать и использовать этот настраиваемый сериализатор?

Похоже, что ссылка может быть хорошей отправной точкой в ​​сочетании с PDF с сайта ссылка в комментариях, которая дает следующую формулу Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) ), ноесли у кого-то есть лучшее объяснение того, что именно мне нужно извлечь и как заставить WCF использовать мой новый сериализатор, я бы с удовольствием это услышал.

1 Ответ

4 голосов
/ 05 августа 2011

Вы нашли мой вопрос :)

Это очень интересная проблема.MS часто обвиняли в том, что они создают небезопасные системы и API, и поэтому некоторые инженеры в MS стали внедрять некоторые идеи о том, что безопасно, а что нет, в новые API.Профиль UserNameToken с переваренным паролем как раз и является результатом этих усилий.Он считается недостаточно безопасным и поэтому полностью исключен из WCF.Что ж, это не должно быть проблемой, если WCF не будет API для взаимодействия с другими платформами и средами, где профиль UserNameToken с переваренным паролем является очень популярным.

Да, мы сделали собственный сериализатор токенов, когда решили проблему.Речь идет не только о сериализаторе токенов.Вам действительно нужно реализовать довольно много классов, чтобы это работало.Я не буду делиться нашей реализацией, потому что это был не мой код, но вы можете попробовать этот .

...