2012-06-23 4 views
4

У меня есть службы WCF, сконфигурированные с обязательным net.tcp:Возможно ли избежать указания servicePrincipalName, если оба клиента и службы работают под одной учетной записью на одном сервере?

<netTcpBinding> 
    <binding > 
     <security mode="Transport"> 
      <transport clientCredentialType="Windows" /> 
      <message clientCredentialType="None" /> 
     </security> 
    </binding> 
</netTcpBinding> 

У меня есть клиент - веб-приложение. Оба работают под управлением NT AUTHORITY \ NETWORK SERVICE на том же сервере, только в разных портах.

Когда клиент пытается подключиться к услуге, это приводит к ошибке:

System.ComponentModel.Win32Exception: The logon attempt failed

Это может быть исправлено с указанием ServicePrincipalName на стороне клиента:

<endpoint> 
    <identity> 
     <servicePrincipalName value="NT AUTHORITY\NETWORK SERVICE" /> 
    </identity> 
</endpoint> 

Но я могу избежать этого? Я хочу, чтобы клиент использовал его текущего пользователя.

ответ

4

Значение servicePrincipalName int endpoint/identity в конфигурации клиента не указывает идентификатор клиента, а идентификатор ожидаемого сервиса. Помните, что аутентификация WCF является взаимной (клиент также идентифицирует услугу)

В этом случае клиент ожидает, что услуга будет работать под учетной записью «Сетевая услуга».

<endpoint> 
    <identity> 
     <servicePrincipalName value="NT AUTHORITY\NETWORK SERVICE" /> 
    </identity> 
</endpoint> 

Если клиент и сервис находятся на той же машине, это может быть заменен

Authentication Service
<endpoint> 
    <identity> 
     <servicePrincipalName value="host/localhost" /> 
    </identity> 
</endpoint> 

теперь в зависимости от имени DNS (LOCALHOST)