AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.08.2020, 21:33   #1  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
? Выполнение действия от имени пользователя в кастомном сервисе
Есть сервер с развернутым 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 или как то можно решить ее по другому?
__________________
Моё: Cайт - Код - Dynamics365 Tools
Старый 21.08.2020, 04:04   #2  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
С такой проблемой не сталкивался, но подошел бы к решению со стороны 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  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Вообще говоря, с 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");
Пробовал даже с использовать богомерзкий CrmServiceClient
Код:
var service = new CrmServiceClient(CredentialCache.DefaultNetworkCredentials, "domain.ru", "80", "MyOrg", true);
service.CallerId = new Guid("DBFD0A87-77DF-E911-A86A-005056010A7B");
При любом раскладе, результат выполнения WhoAmIRequest - пользователь из AppPool.
Либо этот прием не распространяется на WhoAmIRequest, либо я чета не так делаю, либо это вообще не работает...
__________________
Моё: Cайт - Код - Dynamics365 Tools
Старый 21.08.2020, 17:25   #4  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от ZooY Посмотреть сообщение
Пробовал даже с использовать богомерзкий CrmServiceClient
В вопросы религии/верований не вмешиваюсь, но ваш код с OrganizationServiceProxy не будет работать с онлайном. Код с CrmServiceClient будет работать и онлайн и последний онпрем и даже онпрем 2013. Но опять таки убеждать не буду - ваше дело.

Цитата:
Сообщение от ZooY Посмотреть сообщение
Либо этот прием не распространяется на WhoAmIRequest, либо я чета не так делаю, либо это вообще не работает...
WhoAmI сообщение всегда будет возвращать пользователя, под которым выполнено подключение к системе. А вот после доставки сообщения в систему результаты будут несколько другими. У меня под рукой была тестовая консоль, которая создавала в системе имейлы. Вторая строка со скриншота - без установки CallerId, первая - с установкой другого пользователя. Результат, как говорится, на скришоте:

Нажмите на изображение для увеличения
Название: Email_CallerId.png
Просмотров: 97
Размер:	5.7 Кб
ID:	12923
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit

Последний раз редактировалось a33ik; 21.08.2020 в 18:07.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Расширенный поиск от имени другого пользователя Otti Dynamics CRM: Разработка 3 31.05.2017 09:44
Microsoft CRM 2015: разрешить подготавливать письма в быстрой кампании от имени другого пользователя Drakonchik2706 Dynamics CRM: Администрирование 1 02.11.2015 15:17
Кеширование логина пользователя при смене доменного имени Eugene.Ostroukhov Dynamics CRM: Разработка 4 05.03.2013 11:05
Как найти пользователя в CRM по его Имени в домене? SuBwooFer Dynamics CRM: Разработка 1 10.01.2010 18:25
Ошибка после изменениями имени пользователя в AD sergeyjb Dynamics CRM: Администрирование 20 29.10.2008 18:27

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:09.