Вопрос

Я пишу услугу WCF, требуется осенний и сеанс.

Это нормально, когда я пытался назвать его на моей локальной машине, но на удаленном компьютере он всегда не удался с такой ошибкой:

Интерфейс для аутентификации поставщика службы поддержки безопасности (SSPI).Сервер может не работать в учетной записи с идентификатором «Хост / хост-имя».Если сервер работает в учетной записи услуг (например, сетевая служба), укажите службу ServicePrinciPalname учетной записи в качестве идентификатора в конечной основе для сервера.Если сервер запущен в учетной записи пользователя, укажите учетную запись UserPrincipalName в качестве идентификатора в конечной площадке для сервера.

Если я предоставил UPN, он бросает исключение неисправности личности.

Вот мой конфиг:

сервер config (приложение):

<system.serviceModel>    
    <behaviors>
      <serviceBehaviors>
        <behavior name="default">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceAuthorization impersonateCallerForAllOperations="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <netTcpBinding>
        <binding name="DataService.netTcpBinding">
          <readerQuotas maxArrayLength="65535" maxBytesPerRead="2147483647" maxStringContentLength="2147483647"/>
          <reliableSession enabled="true" inactivityTimeout="24:00:00" ordered="true"/>          
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="Windows" />
            <transport clientCredentialType="Windows"/>          
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <services>
      <service behaviorConfiguration="default" name="DataService.DataService">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration="DataService.netTcpBinding" 
          name="DataService.DataService" contract="DataService.IDataService"/>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://address:4504/"/>
            <add baseAddress="net.tcp://address:4503/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
</system.serviceModel>
.

Client Config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>     
        <bindings>
            <netTcpBinding>
                <binding name="DataService.DataService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="24.00:00:00"
                        enabled="true" />
                    <security mode="TransportWithMessageCredential">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" algorithmSuite="Default" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://address:4503/" binding="netTcpBinding"
                bindingConfiguration="DataService.DataService"
                contract="ataService.IDataService" name="DataService.DataService">
              <identity>
                <dns value="DOMAIN"/>                                                  
              </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>
.

Любая помощь будет очень ценится.

Это было полезно?

Решение

Windows Services Зарегистрируйте себя либо именем пользователя пользователя или именем команды пользователя или именем службы ( Документация ). Чтобы процитировать из этой ссылки: « Если служба работает под учетной записью LocalSystem, Localservice или Networkservice, имя сервиса (SPN) генерируется по умолчанию в виде хоста / потому, что эти учетные записи имеют доступ к компьютеру PN-данные. Если служба работает под другой учетной записью, фонд связи Windows (WCF) генерирует UPN в виде @. "На самом деле эта цитата скорее похожа на то, что указано ваше сообщение об ошибке. Так кажется, ...

a) Если служба работает под учетной записью локальной службы или аналогичной стандартной учетной записи, вам необходимо настроить файл конфигурации Client , чтобы иметь это, где имена фактического сервера «адрес» и Конечная точка работает на порту 4503:

<identity>
     <servicePrincipalName value="host/address:4503" />
</identity>
.

b) попеременно, если вы работаете под выделенной учетной записью службы (давайте назовем ее «Serviceacount» на домене «Mydomain»), то вы хотите

<identity>
     <userPrincipalName value="ServiceAccount@MyDomain" />
</identity>
.

Обратите внимание, что вам может потребоваться использовать полностью квалифицированное доменное имя в обоих случаях, включая уровень леса и дерева. Для простого домена внутри вашей личной локальной сети / WAN, который будет означать адрес .mydomain.local и forgieCoucount@mydomain.local. Если ваш домен находится в дереве, называемом mytree, то он будет сервоприводным@mydomain.mytree.local; Если это в лесу, называемом MyForest, то он будет сервоприводным@mydomain.mytree.myforest.local (и похоже на СервисПриннцибалнал). Полностью квалифицированное имя необходимо Когда вы используют Kerberos для аутентификации.

Другие советы

Есть также грязный взлом, как опубликовано Вот , здесь and Здесь , и проанализирован здесь .

Вы можете поставить основное имя основной службы (SPN).В этом случае WCF не потерпит неудачу, Но падайте в NTLM для аутентификации, которая не проверяет принцип.

Так, конфигурация:

    <identity>
      <servicePrincipalName value="dummy" >
    </identity>
.

и программно

    EndpointIdentity identity = EndpointIdentity.CreateSpnIdentity("dummy");
.

Использование Channelfactory:

    Uri uri = new Uri("net.tcp://<myServer>:<myPort>/myServiceAddress");
    ChannelFactory channelFactory = new ChannelFactory<IMyContract>(new NetTcpBinding());
    channelFactory.CreateChannel(new EndpointAddress(uri, identity)
.

также будет работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top