Как использовать WS-Security и получить доступ к UsernameToken из веб-службы ASMX?

Итак, у нас есть устаревшая веб-служба ASMX, которая в настоящее время работает в .NET 3.5, и мы используем Visual Studio 2008.

Проблема в том, что нам нужно добавить аутентификацию, и мы хотели бы воспользоваться преимуществами модели WS-Security, не нарушая работу существующих внутренних клиентов, которым в настоящее время не требуется аутентификация.

Мы думали о добавлении пользовательских заголовков, но это не очень похоже на WS-Security. Кроме того, обновление до WCF, хотя и является долгосрочной целью, нецелесообразно в краткосрочной перспективе.

Есть ли способ получить доступ к UsernameToken (при условии, что он передан клиентом) косвенно в заголовке мыла веб-службы ASMX VS2008?


person James Michael Hare    schedule 08.12.2009    source источник
comment
в то время как долгосрочная цель нежизнеспособна в краткосрочной перспективе, вы запустили короткий прототип, чтобы проверить усилия? Могу поспорить, что миграция требует меньше усилий, чем внедрение пользовательских компонентов инфраструктуры. ReSharper -› выдвижные интерфейсы -> небольшая помощь от Dr Search & Replace... просто мысли вслух.   -  person Alex    schedule 09.12.2009


Ответы (1)


Вы можете попробовать улучшения веб-служб (WSE) 3.0. Это добавляет поддержку старой версии WS-Security (кажется, версии 2004 года — WCF поддерживает версии 2005 и 2007 годов). Он расположен поверх ASMX, не мешая ему, и по-прежнему работает в .NET 3.5/WS2008.

Теперь о минусах:

  • VS2008 не поддерживает добавление или обновление веб-ссылок с поддержкой WSE в клиентском коде. Он с радостью создаст обычный прокси-класс ASMX, но не дополнительный прокси-класс WSE, необходимый для аутентификации. Любой существующий прокси-код WSE, который у вас есть, компилируется нормально, но будет удален, если вы попытаетесь обновить веб-ссылку в IDE. Если у вас есть копия VS2005, вы можете использовать ее для поддержки или, по крайней мере, создания веб-ссылки на стороне клиента.
  • Насколько мне известно, реализация WS-Security в WSE не на 100 % совместима с реализациями WCF. Вам нужно будет провести собственное тестирование совместимости с WCF, чтобы убедиться.

Пример

Указание учетных данных на клиенте:

void SetUsernameCredential(WebServicesClientProtocol service, string userName, string password) {
    UsernameToken token = new UsernameToken(userName, password, PasswordOption.SendHashed);
    service.SetClientCredential(token);
}

Аутентификация учетных данных на сервере:

public class MyUsernameTokenManager : UsernameTokenManager {
    protected override string AuthenticateToken(UsernameToken token) {
        // Authenticate here.
        // If succeess, return an authenticated IPrincipal and the user's password as shown.
        // If failure, throw an exception of your choosing.
        token.Principal = principal;
        return password;
    }
}

Чтение учетных данных на сервере:

IPrincipal principal = RequestSoapContext.Current.IdentityToken.Principal;
person Christian Hayter    schedule 08.12.2009
comment
Я считаю, что мой ответ полезен в пределах, налагаемых вопросом. Я никогда не говорил, что рекомендую его для новой разработки. - person Christian Hayter; 08.12.2009
comment
Я считаю, что нам нужно добавить аутентификацию, чтобы быть новой разработкой в ​​этом контексте. -1 для того, чтобы показать ОП, как засунуть голову в петлю. - person John Saunders; 09.12.2009
comment
Джон, почему бы тебе не помочь и не предложить лучший способ сделать это. - person SoftwareSavant; 23.08.2012