У меня есть собственная служба WCF, которая размещается в настольном приложении.
Я могу успешно подключиться к службе локально на моем ПК, но я не могу использовать службу удаленно, по крайней мере без предоставления учетных данных уровня Windows / домена.
Я использую следующий код для запуска службы в приложении:
ServiceHost host = new ServiceHost(
typeof (SMService),
new Uri("net.tcp://localhost:" + SMGlobals._DEFAULTSERVICEPORT.ToString() + "/SMService"));
host.AddServiceEndpoint(
typeof(ISMService),
new NetTcpBinding(),
"");
System.ServiceModel.Channels.Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
var metadataBehavior =
new ServiceMetadataBehavior();
host.Description.Behaviors.Add(metadataBehavior);
host.AddServiceEndpoint(
typeof(IMetadataExchange),
mexBinding,
"net.tcp://localhost:" + SMGlobals._DEFAULTSERVICEPORT.ToString() + "/SMService/mex");
host.Open();
SMGlobals.SMServiceHost = host;
Если я создаю простой клиент для вызова службы, используя следующий код:
var client = new SMServiceClient();
var uri = "net.tcp://192.168.11.10:8760/SMService";
client.Endpoint.Address = new EndpointAddress(uri);
var initiateResponse = client.InitiateAuthentication(new InitiateAuthenticationRequest());
MessageBox.Show("Success!");
Я получаю следующее исключение:
System.ServiceModel.Security.SecurityNegotiationException: сервер отклонил учетные данные клиента. ---> System.Security.Authentication.InvalidCredentialException: сервер отклонил учетные данные клиента. ---> System.ComponentModel.Win32Exception: попытка входа не удалась
Теперь из другого исследования я обнаружил, что могу предоставить свои учетные данные при вызове клиента, используя следующий код:
var client = new SMServiceClient();
var uri = "net.tcp://192.168.11.10:8760/SMService";
client.Endpoint.Address = new EndpointAddress(uri);
client.ClientCredentials.Windows.ClientCredential.Domain = "domain";
client.ClientCredentials.Windows.ClientCredential.UserName = "my_user_name";
client.ClientCredentials.Windows.ClientCredential.Password = "my_password";
var initiateResponse = client.InitiateAuthentication(new InitiateAuthenticationRequest());
MessageBox.Show("Success!");
И теперь код успешно завершается.
Мне трудно понять, как убрать это требование. Я попытался возиться с настройкой привязки на клиенте, но безуспешно.
Кто-нибудь может указать мне правильное направление?