Можно ли избежать указания 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)

Другие вопросы по тегам