Как получить имя пользователя и пароль в сервисной части вызова WCF? - PullRequest
6 голосов
/ 02 марта 2011

Когда я предоставляю учетные данные на клиенте со следующим кодом:

myChannelFactory.Credentials.UserName.UserName = "username";
myChannelFactory.Credentials.UserName.Password = "password";

Затем на стороне сервера я вижу, что эти учетные данные доступны в

operationContext.IncomingMessageHeaders[1]

Однако есть ли более удобный способ получить имя пользователя и пароль? Все, что я вижу в OperationContext, это хаос свойств и нетипизированных списков, и я не могу найти ничего, что указывает, где я могу получить это.

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Вы можете использовать статическое Current свойство в ServiceSecurityContext классе , чтобы получить текущий ServiceSecurityContext для вызываемой операции.

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

Однако он не будет (и не должен) раскрывать пароль. Если вам действительно нужен пароль, вам придется перейти на уровень сообщений и осмотреть заголовки, как вы видели.

2 голосов
/ 02 марта 2011

Это полностью зависит от используемой привязки, и нет общего ответа.

Например, если вы используете NetNamedPipeBinding и делаете

myChannelFactory.Credentials.UserName.UserName = "username";
myChannelFactory.Credentials.UserName.Password = "password"; 

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

Привязка будет использовать эти данные только в том случае, еслион настроен с параметрами безопасности, которые определяют использование учетных данных имени пользователя / пароля.Все стандартные привязки, которые делают это, будут использовать учетные данные для аутентификации, результаты которых затем будут отображаться в сервисе через ServiceSecurityContext, как указано в casperOne, и не будут включать данные пароля.

В порядкедля поддержки аутентификации данные должны переноситься где-то в заголовках сообщений.Точно, где и в какой форме снова будет зависеть от привязки.Не думайте, что вы всегда найдете их в operationContext.IncomingMessageHeaders[1].

РЕДАКТИРОВАТЬ: Возможно, вы сможете создать пользовательскую привязку, которая даст вам то, что вы ищете.

CustomBinding binding = new CustomBinding( ... );
binding.Elements.Insert(1, 
  SecurityBindingElement.CreateUserNameOverTransportBindingElement());

На стороне службы укажите UserNamePasswordValidator и настройте учетные данные следующим образом:

serviceHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = 
  System.ServiceModel.Security.UserNamePasswordValidationMode.Custom;
servicehost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = 
  new MyUserNamePasswordValidator();

Имя пользователя и пароль будут доставлены в метод Validate из MyUserNamePasswordValidator.

ВНИМАНИЕ: Это не безопасный механизм аутентификации, если вы не используете безопасный транспорт, так как учетные данные отправляются в открытом виде в заголовке сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...