繁体   English   中英

Azure广告无法在microsoft.systemForCrossDomainIdentityManagement nuget程序包上使用补丁更新用户

[英]Azure Ad fails to update users using Patch on microsoft.systemForCrossDomainIdentityManagement nuget package

我们使用microsoft.systemForCrossDomainIdentityManagement nuget包创建了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的一个补丁请求如下所示(将失败):

{“ 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”],

“ Operations”:[{“ op”:“ Replace”,“ path”:“ displayName”,“ value”:

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

}}

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

我们应该如何解决呢?

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

由于一个多月后没有收到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>();

...

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM