Имя пользователя WCF без сертификата


Я работаю над проектом, в котором мне нужно следующее.

  • служба WCF на стороне сервера (.NET 3.5)
  • клиент WPF для клиентской части (.NET 3.0)

У меня есть существующее приложение, в котором я должен использовать аутентификацию и авторизацию (на стороне сервера). Мне также нужно сохранить некоторые метаданные о пользователе в основном потоке службы WCF (объект сайта). Я делаю это так, чтобы я мог получить его в службе WCF, если мне это абсолютно необходимо; некоторые этого может потребовать бизнес-логика. Так что мой план был, чтобы сделать следующее...

Создайте пользовательский ServiceAuthorizationManager для сервера, и там я войду в систему пользователя и получу роли из существующего приложения. Я буду кэшировать объект" Site", а при дальнейших запросах вытаскивать из кэша. Мне также понадобится объект CustomPrincipal для хранения моих пользовательских данных. Я хочу олицетворять пользователя, чтобы использовать встроенную фильтрацию ролей в WCF следующим образом:

[PrincipalPermission(SecurityAction.Demand, Role = "Role1")]
public string[] RolesForUser(string username){}

Я попытался использовать тот самый ASP.NET авторизация с помощью пользовательского поставщика ролей, но я не смог ничего установить на текущего участника. Я также попытался использовать пользовательскую политику IAuthorizationPolicy, но возникли проблемы. Эти проблемы касались возможности использовать WCFClient.exe-приложение, когда оно обнаруживало (используя mex endpoing), оно не давало никаких учетных данных, поэтому вход в систему не удался. В конце концов я решил, что ServiceAuthorizationManager-это правильный путь, но я открыт для других предложения.

На клиенте я соберу учетные данные и помещу их в прокси-класс WCF следующим образом.

proxy.ChannelFactory.Credentials.UserName.UserName = userName;
proxy.ChannelFactory.Credentials.UserName.Password = password;

Когда я начал спускаться по этому маршруту, я заметил, что мне не удалось получить имя пользователя/пароль в методе CheckAccessCore моего класса manager. Дальнейшее расследование показало, что я действительно должен аутентифицироваться в пользовательском UserNamePasswordValidator. Поэтому я создал один из них. Проблема в том, что метод validate никогда не вызывался.

Далее исследование показало, что для вызова метода validate моя служба WCF должна иметь безопасность на уровне сообщений или транспорта. Проблема в том, что я не могу понять, как получить сообщение или безопасность транспортного уровня без сертификата X. 509. Этот продукт собирается в нескольких сотнях невероятно заблокированных машин, и установить сертификат невозможно.

Есть ли способ сделать то, что я прошу, не устанавливая сертификат?
3 6

3 ответа:

Короткий ответ; вы не можете. как только вы используете имя пользователя / пароль, вам нужен какой-то безопасный канал.

Однако вам не нужны сертификаты на клиентах; только на сервере.

На самом деле это возможно, но вам нужно будет реализовать свою собственную привязку.

Yaron Naveh разработал привязку WCF, которая позволяет использовать открытый текст username / password через HTTP. Его Статья включает в себя код для привязки.

Я не знаю подробностей вашей сетевой инфраструктуры, но если вы находитесь в домене Windows, вам следует рассмотреть возможность использования учетных данных Windows.

Можно использовать безопасность сообщений без сертификатов, если вы используете учетные данные Windows. Это поведение по умолчанию wsHttpBinding (из коробки).

Использование готовых решений (без реализации вашей собственной привязки) WCF поощряет (требует) вас использовать безопасный канал всякий раз, когда учетные данные проверки подлинности включено в сообщения.

Использование пользовательской привязки, которая позволяет указывать учетные данные в открытом тексте, безусловно, является решением, но я бы дважды подумал, прежде чем использовать его.