Рекламному объявлению Azure не удается обновить пользователей с помощью исправления в пакете nuget microsoft.systemForCrossDomainIdentityManagement - PullRequest
0 голосов
/ 17 января 2019

Мы создали интеграцию 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, как показано ниже (который не будет выполнен):

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

Пока запрос работает так:

{ "схемы": [ "урна: IETF: PARAMS: SCIM: API: Сообщения: 2,0: PatchOp"]

"Операции": [ { "Оп": "Заменить", "путь": "DisplayName", "значение":

[{"$ ref": null, "value": "User x"}]}]

}}

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

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

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

1 Ответ

0 голосов
/ 18 февраля 2019

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

Я обсудил проблему и решение в следующей ссылке, но я все еще жду исправления от Microsoft: \ http://pilpag.blogspot.com/2019/02/enabling-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>();

...

}
...