0

我们已经使用 microsoft.systemForCrossDomainIdentityManagementnuget 包创建了一个 SCIM 集成,此处已对其进行了描述:

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

我们已经使用 Postman 测试了 API,它们可以正常工作,但是当我们使用 Azure AD 测试它们时,补丁请求会失败。

查看日志并缩小范围,我们发现请求的格式与 microsoft.systemForCrossDomainIdentityManagement 期望的格式不同。

来自 AD 的一个补丁请求如下所示(将失败):

{ "模式":["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"] ,

“操作”:[ {“操作”:“替换”,“路径”:“显示名称”,“值”:

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

}}

  • 请注意 2 个请求之间的区别,第一个调用是字符串,第二个调用是对象列表。

我们应该如何解决这个问题?

Nuget 包接受请求并传递 IPatchRequest,因此请求甚至不会接收到我们的代码部分,并且这两部分都是 Microsoft :|

4

1 回答 1

0

由于一个多月后微软没有回复,他们唯一知道的解决此问题的方法是在呼叫到达微软的部分代码(使用中间件)之前拦截呼叫并将其更改为以下格式他们期待:\

我已经在下面的链接中进一步讨论了问题和解决方案,但我仍在等待 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>();

...

}
于 2019-02-18T16:42:52.587 回答