#wcf #windows-services
#wcf #windows-services
Вопрос:
У меня есть некоторый код, который использует службу WCF. Служба защищена базовой аутентификацией, поэтому при создании клиента я использую следующий код:
BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
httpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
httpBinding.Security.Transport.Realm = service_realm;
EndpointAddress address = new EndpointAddress(service_address);
Service.ServiceClient client = new Service.ServiceClient(httpBinding, address);
client.ClientCredentials.UserName.UserName = service_username;
client.ClientCredentials.UserName.Password = service_password;
Работает нормально, когда я запускаю код из консольного приложения. Но когда я запускаю тот же код из службы Windows, выдается исключение MessageSecurityException, сообщающее мне, что мой запрос был несанкционированным. По какой-то причине кажется, что для аутентификации используется текущая учетная запись Windows, потому что моя собственная учетная запись имеет доступ к службе. Но я этого не хочу, я хочу, чтобы он использовал сохраненные учетные данные. Чего мне здесь не хватает?
Ответ №1:
WCF BasicHttpBinding не поддерживает учетные данные открытого текста; причина в том, что в тот момент, когда вы хотите передать учетные данные в транспортной привязке, WCF требует, чтобы базовый транспорт был безопасным транспортом, таким как SSL.
Для того, чтобы ваш код работал, вам необходимо будет использовать службу через https
или с использованием сертификатов или шифрования.
Комментарии:
1. Это может быть так, но раньше это работало, когда у меня был обычный app.config. Что изменилось, так это то, что теперь я создаю привязку программно, и это, похоже, вызвало проблему. Я думаю, что ваше утверждение верно для wsHttpBinding, но не для BasicHttpBinding.
Ответ №2:
Кажется, исправлено с помощью этой конфигурации:
_httpBinding = new BasicHttpBinding();
_httpBinding.Безопасность.Режим = базовый httpsecuritymode.TransportCredentialOnly; _httpBinding.Безопасность.Транспорт.clientCredentialType = HttpClientCredentialType.Basic; _httpBinding.Безопасность.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
_httpBinding.Безопасность.Сообщение.clientCredentialType = BasicHttpMessageCredentialType.Имя пользователя; _httpBinding.Безопасность.Сообщение.AlgorithmSuite = SecurityAlgorithmSuite.По умолчанию;
_httpBinding.AllowCookies = false; _httpBinding.BypassProxyOnLocal = false; _httpBinding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; _httpBinding.MessageEncoding = WSMessageEncoding.Текст; _httpBinding.TextEncoding = Encoding.UTF8; _httpBinding.TransferMode = TransferMode.Buffered; _httpBinding.UseDefaultWebProxy = false; Служба.Клиент ServiceClient = новая служба.ServiceClient(_httpBinding, _address);
клиент.ClientCredentials.Имя пользователя.Имя пользователя = service_username; клиент.ClientCredentials.Имя пользователя.Пароль = service_password;