Локально размещенный сервис WCF - я не хочу, чтобы клиенты проходили аутентификацию - PullRequest
1 голос
/ 23 февраля 2011

У меня есть собственная служба 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!");

И теперь код успешно завершается.

Мне трудно понять, как убрать это требование. Я попытался возиться с настройкой привязки на клиенте, но безуспешно.

Кто-нибудь может указать мне правильное направление?

Ответы [ 3 ]

1 голос
/ 23 февраля 2011

У привязки Tcp по умолчанию включена защита, поэтому, чтобы получить то, что вы хотите, вам нужно явно отключить ее. Добавьте свою конечную точку, как это. Вы также можете изучить справку по MSDN для NetTcpBinding, поскольку вам может потребоваться использовать альтернативный конструктор для отключения надежного обмена сообщениями.

 host.AddServiceEndpoint(
            typeof(ISMService),
            new NetTcpBinding(SecurityMode.None),
            "");
0 голосов
/ 17 ноября 2012

У меня была похожая проблема. Работал локально между двумя процессами, но один и тот же код не работал, когда эти два процесса были размещены на разных компьютерах (или локально, с использованием общедоступного URL-адреса, который преобразовывался в локальный компьютер, например, mylocalmachine.corp.com). Я обнаружил, что мне нужно было явно установить безопасность анонимной привязки на «Нет»:

<binding name="TcpAnonymousBinding" portSharingEnabled="true" receiveTimeout="24:00:00">
    <security mode="None"/>
</binding>
0 голосов
/ 23 февраля 2011
...