Имя пользователя WCF без сертификата - PullRequest
6 голосов
/ 19 декабря 2008

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

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

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

22 голосов
/ 15 февраля 2009

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

Ярон Наве разработал привязку WCF, которая позволяет использовать незашифрованное имя пользователя и пароль через HTTP Его статья содержит код для привязки.

6 голосов
/ 19 декабря 2008

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

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

1 голос
/ 22 января 2012

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

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

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

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

...