Рекламному объявлению Azure не удается обновить пользователей с помощью исправления в пакете nuget microsoft.systemForCrossDomainIdentityManagement
Мы создали интеграцию SCIM с использованием microsoft.systemForCrossDomainIdentityManagement
пакет nuget, который был описан здесь:
Мы протестировали API с помощью Postman, и они работают так, как должны, но когда мы тестируем их с помощью Azure AD, запросы на исправления не выполняются.
Глядя на журналы и сужая их, мы обнаружили, что запрос не в том формате, который ожидает microsoft.systemForCrossDomainIdentityManagement.
Один запрос на исправление от AD, как показано ниже (который потерпит неудачу):
{"schemas": ["urn: ietf: params: scim: api: messages: 2.0: PatchOp"], "Operations": [ {"op":"Replace","path": "displayName","value": "Пользователь X"} ]}
Пока запрос работает так:
{"schemas": ["urn: ietf: params: scim: api: messages: 2.0: PatchOp"],
"Операции": [ {"op":"Заменить","путь": "displayName","value":
[{"$ ref": null, "value": "User x"}]}]
}}
- Обратите внимание на разницу между двумя запросами, которые в первом вызове представляют собой строку, а во втором - список объектов.
Как мы должны это исправить?
Пакет Nuget принимает запрос и доставляет IPatchRequest, поэтому запрос даже не поступает в нашу часть кода, и обе части принадлежат Microsoft:|
1 ответ
Поскольку ответа от 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>();
...
}