Есть сервер с развернутым CRM 2016.
На отдельном сервере размещается сайт с WebAPI (поддерживает работу фронта CRM в части сложной бизнес-логики).
Для этого кастомного сайта включена Windows аутентификация, все сотальные способы аутентификации выключены.
Основная масса логики выполянется на сайте от имени пользователя, указанного в Application Pool (т.е. без каких либо извратов). В Web.config есть строка адреса OrganizationService, а пользователь AppPool имеет права системного администратора... И все это прекрасно работает.
Появилась необходимость выполнять часть кода от имени того пользователя, который стучиться на этот кастомный сайт (естественн, пользователь является пользователем CRM).
Казалось бы - все просто...
Код:
using (var impersonationContext = ((WindowsIdentity)User.Identity).Impersonate())
{
var credentials = new ClientCredentials();
credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
var service = new OrganizationServiceProxy(serviceUrl, null, credentials, null);
...
}
Делаешь имперсонализацию, потом создаеш экземпляр сервиса (который будет создан уже от имени нужного пользователя).
И когда CRM и кастомный веб-сервис находятся на одном сервере (в одном IIS) оно таки работает.
А вот когда CRM и сервис разнесены по разным серверам - получаю ошибку "
The caller was not authenticated by the service".
Вычитал в интернетах, что проблема может быть связана с неким
Double-Hop.
Предлагается решение - использовать Kerberos, но там чета SPN настрой, IIS настрой, даже браузер настрой...
Собственно вопрос... Сталкивался ли кто-то с такой проблемой и действительно ли она решается использованием Kerberos или как то можно решить ее по другому?