Я работаю над проектом, в котором мне нужно следующее.
- Служба 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 . Этот продукт собирается на несколько сотен невероятно заблокированных машин, и установка сертификата невозможна.
Есть ли способ сделать то, что я спрашиваю, без установки сертификата?