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