|  20.08.2020, 21:33 | #1 | 
| Участник |  Выполнение действия от имени пользователя в кастомном сервисе 
			
			Есть сервер с развернутым 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 или как то можно решить ее по другому? | 
|  | 
|  21.08.2020, 04:04 | #2 | 
| Чайный пьяница | 
			
			С такой проблемой не сталкивался, но подошел бы к решению со стороны CRM CDK. У CrmServiceClient есть возможность имперсониваться через установку свойства CallerId - https://docs.microsoft.com/en-us/dot...rmtooling-ce-9 Так что алгоритм был бы следующий: 1. Получить из контекста идентификатор пользователя, который стучится. 2. Инстанциировал CrmServiceClient под учетной записью администратора. 3. Из systemuser по AD имени пользователя получил бы его Guid в CRM. 4. Присвоил бы полученный Guid свойству CallerId. 5. Все последующие вызовы будут идти от имени указанного пользователя. 
				__________________ Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit | 
|  | 
|  21.08.2020, 10:15 | #3 | 
| Участник | 
			
			Вообще говоря, с CallerId я уже пробовал играться... Делаю вот так Код: var credentials = new ClientCredentials();
credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
var service = new OrganizationServiceProxy(serviceUrl, null, credentials, null);
service.CallerId = new Guid("DBFD0A87-77DF-E911-A86A-005056010A7B");Код: var service = new CrmServiceClient(CredentialCache.DefaultNetworkCredentials, "domain.ru", "80", "MyOrg", true);
service.CallerId = new Guid("DBFD0A87-77DF-E911-A86A-005056010A7B");Либо этот прием не распространяется на WhoAmIRequest, либо я чета не так делаю, либо это вообще не работает... | 
|  | 
|  21.08.2020, 17:25 | #4 | 
| Чайный пьяница | 
			
			В вопросы религии/верований не вмешиваюсь, но ваш код с OrganizationServiceProxy не будет работать с онлайном. Код с CrmServiceClient будет работать и онлайн и последний онпрем и даже онпрем 2013. Но опять таки убеждать не буду - ваше дело. Цитата: 
				__________________ Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit Последний раз редактировалось a33ik; 21.08.2020 в 18:07. | 
|  | 
|  | 
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
| 
 |