Можно ли избежать указания servicePrincipalName, если клиент и служба работают под одной учетной записью на одном сервере?
У меня есть служба WCF, настроенная с привязкой net.tcp:
<netTcpBinding>
<binding >
<security mode="Transport">
<transport clientCredentialType="Windows" />
<message clientCredentialType="None" />
</security>
</binding>
</netTcpBinding>
У меня есть клиент - веб-приложение. Оба работают под NT AUTHORITY\NETWORK SERVICE на одном сервере, только разные порты.
Когда клиент пытается подключиться к службе, это приводит к ошибке:
System.ComponentModel.Win32Exception: попытка входа не удалась
Это можно исправить, указав servicePrincipalName на стороне клиента:
<endpoint>
<identity>
<servicePrincipalName value="NT AUTHORITY\NETWORK SERVICE" />
</identity>
</endpoint>
Но могу ли я этого избежать? Я хочу, чтобы клиент использовал своего текущего пользователя.
1 ответ
В значении servicePrincipalName в разделе конечная точка / идентификатор конфигурации клиента указывается не идентификатор клиента, а ожидаемый идентификатор службы. Помните, что аутентификация WCF является взаимной (клиент также идентифицирует сервис)
В этом случае клиент ожидает, что служба будет работать под учетной записью "сетевой службы".
<endpoint>
<identity>
<servicePrincipalName value="NT AUTHORITY\NETWORK SERVICE" />
</identity>
</endpoint>
Если клиент и служба расположены на одном компьютере, это можно заменить на
<endpoint>
<identity>
<servicePrincipalName value="host/localhost" />
</identity>
</endpoint>
Проверка подлинности службы теперь зависит от имени DNS (localhost)