Как WhoAmIRequest возвращал пользователя SYSTEM

Столкнулся на днях с интересной проблемой: несмотря на то, что в конфиге приложения выставлены необходимые настройки, запрос WhoAmIRequest всегда возвращал данные системного пользователя CRM - SYSTEM.

...
 <system.web>
    ...
    <authentication mode="Windows"/>
    <identity impersonate="true"/>
    ...
 </system.web>
 ...

Как оказалось, причина была в следующем - WhoAmIRequest выполнялся в методе DoTheJobInThread() в отдельном потоке:

static void Main()
{
    ...
    ParameterizedThreadStart threadStart = new ParameterizedThreadStart(DoTheJobInThread);

    thread.Start(threadParam);
    ...
}

private void DoTheJobInThread(param)
{
    ...
    
    // вернёт пользователя SYSTEM
    WhoAmIResponse user = (WhoAmIResponse)crmService.Execute(new WhoAmIRequest());

    ...
}

Проблема решилась выносом метода с получением идентификатора пользователя в основной поток приложения:

static void Main()
{
    ...
    ParameterizedThreadStart threadStart = new ParameterizedThreadStart(DoTheJobInThread);

    // вернёт имперсонированного пользователя
    WhoAmIResponse user = (WhoAmIResponse)crmService.Execute(new WhoAmIRequest());
    
    // передаём пользователя в поток с параметрами метода
    threadParam.UserId = user.UserId;
    
    thread.Start(threadParam);
    ...
}

Кстати, пока искал решение, нашёл вот такой интересный способ получения идентификатора текущего пользователя:

SELECT systemuserid FROM FilteredSystemUser WHERE domainname = SUSER_SNAME()
Русский
field_vote: 
4.925925
Average: 4.9 (27 votes)

Добавить комментарий