Azure Ad не может обновить пользователей с помощью исправления в пакете nuget microsoft.systemForCrossDomainIdentityManagement

Мы создали интеграцию SCIM с использованием пакета microsoft.systemForCrossDomainIdentityManagement nuget, который был описан здесь:

https://docs.microsoft.com/en-us/azure/active-directory/manage-apps/use-scim-to-provision-users-and-groups

Мы протестировали API-интерфейсы с помощью Postman, и они работают должным образом, но когда мы тестируем их с помощью Azure AD, запросы исправлений не выполняются.

Посмотрев на журналы и сузив их, мы пришли к выводу, что формат запроса отличается от того, который ожидает microsoft.systemForCrossDomainIdentityManagement.

Один запрос на исправление от AD выглядит так, как показано ниже (который не удастся):

{"схемы": ["urn: ietf: params: scim: api: messages: 2.0: PatchOp"], "Операции": [{"op": "Заменить", "путь": "displayName", "значение" : "Пользователь X"}]}

Хотя запрос, который работает, выглядит так:

{"схемы": ["urn: ietf: params: scim: api: messages: 2.0: PatchOp"],

"Операции": [{"op": "Заменить", "путь": "displayName", "value":

[{"$ ref": null, "value": "Пользователь x"}]}]

}}

  • Обратите внимание на разницу между двумя запросами, которые в первом вызове представляют собой строку, а во втором - список объектов.

Как это исправить?

Пакет Nuget принимает запрос и доставляет IPatchRequest, поэтому запрос даже не поступает в нашу часть кода, и обе части принадлежат Microsoft: |


person Ashkan Sirous    schedule 17.01.2019    source источник
comment
Привет, Ашкан, я вижу, что ты тоже создал проблему на Github. Вы получаете сообщение об ошибке или оно просто не обновляется?   -  person Marilee Turscak - MSFT    schedule 24.01.2019
comment
@ MarileeTurscak-MSFT Привет и спасибо за ответ. Да, я получаю: Не удалось обновить пользователя «[email protected]» в customappsso; Ошибка: StatusCode: BadRequest Сообщение: Обработка HTTP-запроса привела к исключению. Дополнительные сведения см. В ответе HTTP, возвращаемом свойством Response этого исключения. Веб-ответ: {Сообщение: запрос недействителен.}. Мы повторим эту операцию при следующей попытке синхронизации.   -  person Ashkan Sirous    schedule 25.01.2019


Ответы (1)


Поскольку более месяца назад от Microsoft не было ответа, единственный известный мне способ исправить это - перехватить вызов до того, как он попадет в часть кода Microsoft (с использованием промежуточного программного обеспечения), и изменить его на формат, который они ожидают: \

Я обсудил проблему и решение по ссылке ниже, но я все еще жду исправления от Microsoft: \ http://pilpag.blogspot.com/2019/02/enables-scim-using-microsoftsystemforc.html

Простое исправление выглядит так:

public class PatchRequestUpdaterMiddleware : OwinMiddleware

{

     private const string OperationValueFinderRegex = "({[\\s\\w\":,.\\[\\]\\\\]*op[\\s\\w\":,.\\[\\]\\\\]*\"value\"\\s*:\\s*)(\"[\\w\\s\\-,.@?!*;\'\\(\\)]+\")"; //{"op":"x","value":"Andrew1"}

public override async Task Invoke(IOwinContext context)

    {

        if (context.Request.Method.ToLower() != "patch")

        {

            await Next.Invoke(context);

            return;

        }

        var streamReader = new StreamReader(context.Request.Body);

        string body = streamReader.ReadToEnd();

        body = Regex.Replace(body, OperationValueFinderRegex, m => $"{m.Groups[1].Value}[{{\"value\":{m.Groups[2].Value}}}]"); //{"op":"x","value":"Ashkan"} ==>> {"op":"x","value":[{"value":"Ashkan"}]}

        context.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(body));

        await Next.Invoke(context);

    }

 }

И просто добавьте это к созданному вами провайдеру:

class myProvider:ProviderBase

{

....

   private void OnServiceStartup(IAppBuilder appBuilder, HttpConfiguration configuration)

        {

...

  appBuilder.Use<PatchRequestUpdaterMiddleware>();

...

}
person Ashkan Sirous    schedule 18.02.2019