[英]Azure Ad fails to update users using Patch on microsoft.systemForCrossDomainIdentityManagement nuget package
我们使用microsoft.systemForCrossDomainIdentityManagement
nuget包创建了SCIM集成,该包在下面进行了描述:
我们已经使用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.