OData错误:"找到没有类型名称的值,并且没有预期的类型可用." 调用Azure Active Directory图谱API时

Mar*_*ana 3 asp.net openid active-directory azure azure-active-directory

让我们看看你的专家是否知道这里发生了什么.

上下文

我们在Azure网站上运行了一个Web应用程序.此WebApp使用OWIN + OpenID Connect根据Azure Active Directory租户对用户进行身份验证.该应用程序还使用Azure AD Graph API来收集目录的某些数据.

我们的代码基于GitHub中提供的这个示例项目:https://github.com/AzureADSamples/WebApp-GraphAPI-DotNet

问题

WebApp几个小时前就完美运行了(对AD进行身份验证并从目录中获取数据),但最奇怪的事情发生在我们身上.今天我们发现我们仍然可以对AD进行身份验证,但Graph API几乎是随机抛出错误.

当我尝试以同步方式通过ObjectId获取特定用户时,我们将错误追溯到特定请求:

Claim claimObject = ClaimsPrincipal.Current.FindFirst(Helper.Constants.ADTenant.ObjectIdClaimType);
string userObjectID = claimObject == null ? string.Empty : claimObject.Value;
ActiveDirectoryClient client = AuthenticationHelper.GetActiveDirectoryClient();
List<IUser> users = client.Users.Where(u => u.ObjectId == userObjectID).ExecuteAsync()
    .Result.CurrentPage.ToList();
Run Code Online (Sandbox Code Playgroud)

事情是最后一行抛出关于OData模型的异常:

"A value without a type name was found and no expected type is available. When the model is specified, each value in the payload must have a type which can be either specified in the payload, explicitly by the caller or implicitly inferred from the parent value."
Run Code Online (Sandbox Code Playgroud)

我们开始将最后一行代码切成片段,如下所示:

IReadOnlyQueryableSet<IUser> queryUsers = client.Users.Where(u => u.ObjectId == userObjectID);
IPagedCollection<IUser> pagedUserCollection = queryUsers.ExecuteAsync().Result;
List<IUser> users = pagedUserCollection.CurrentPage.ToList();
Run Code Online (Sandbox Code Playgroud)

并发现异常是投入这一行:

IPagedCollection<IUser> pagedUserCollection = queryUsers.ExecuteAsync().Result;
Run Code Online (Sandbox Code Playgroud)

最奇怪的是昨天这条线路正常运行,今天开始失败而没有解释.

有谁知道我们做错了什么?为什么今天开始失败?

备注

我们正在使用api-version = 2013-11-8.我们将Azure AD Graph API客户端库保留在版本1.0上,如GitHub上的示例所示.

Dan*_*SFT 7

伙计们,

首先 - 许多道歉引入了这个问题.根本问题是实体(在这种情况下是用户实体)在服务端更新了新集合(AlternativeSignInNamesInfo).通常,添加新实体,属性,集合和复杂类型不应导致客户端库发生重大更改.但是由于ODatalib中的问题,未知的集合不会被简单地忽略.
我完全同意对此的看法,我们绝对不希望让依赖于Graph Client Library的应用程序受到任何中断.我们正在与ODatalib团队合作以解决此问题,因此我们的Graph客户端库不再是一个问题.

与此同时,我们正在回滚我们的Graph服务,因此2.0.5应该再次开始工作.版本2.0.6也应该有效 - 只要您不尝试在User对象(AlternativeSignInNamesInfo)上发布到新集合.

更新:Graph服务已回滚.我还验证了通过Graph Client Library 2.0.5和2.0.6获得用户的效果.

希望这有帮助,并再次抱歉这里引起的任何问题.