OData error: "A value without a type name was found and no expected type is available." when calling Azure Active Directory Graph API

OData error: "A value without a type name was found and no expected type is available." when calling Azure Active Directory Graph API

让我们看看各位专家是否知道这里发生了什么。

上下文

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

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

问题

几个小时前 WebApp 运行良好(向 AD 进行身份验证并从目录中获取数据),但最奇怪的事情发生在我们身上。今天我们发现我们仍然可以针对 AD 进行身份验证,但是图形 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();

最后一行抛出关于 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."

我们开始将最后一行代码分成如下几部分:

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

发现异常是在这一行抛出的:

IPagedCollection<IUser> pagedUserCollection = queryUsers.ExecuteAsync().Result;

最奇怪的是,这条线昨天执行得很好,今天开始毫无解释地失败了。

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

备注

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

中的示例

我刚才也遇到了同样的问题!我有一个应用程序已经运行了几个星期并且没有更改。我通过将 "Microsoft.Azure.ActiveDirectory.GraphClient" 从版本 2.0.5 升级到 2.0.6

来让它工作

是的,将图形客户端 Nuget 包升级到最新的 2.0.6 解决了这个问题。今天早上我也有类似的恐慌。令人难以置信的事实是 Microsoft 推出了新版本的 dll,它破坏了以前版本的应用程序 运行!

各位,

首先 - 很抱歉引入这个问题。潜在的问题是实体(在本例中为用户实体)在服务端更新了一个新集合(AlternativeSignInNamesInfo)。通常,添加新的实体、属性、集合和复杂类型不应导致客户端库发生重大变化。然而,由于 ODatalib 中的一个问题,未知集合不会被简单地忽略。
我完全同意对此的看法,我们绝对不希望依赖 Graph Client Library 的应用程序受到任何中断的影响。我们正在与 ODatalib 团队合作解决此问题,以便我们的 Graph 客户端库向前发展时不再是问题。

与此同时,我们正在回滚我们的 Graph 服务,以便 2.0.5 应该再次开始工作。版本 2.0.6 也应该可以工作 - 只要您不尝试 post 用户对象 (AlternativeSignInNamesInfo) 上的新集合。

更新:图形服务已回滚。我还验证了通过 Graph Client Library 2.0.5 和 2.0.6 获取用户都有效。

希望这对您有所帮助,对于此处造成的任何问题,我们再次深表歉意。

我的团队有类似的经历。安装 2.06 后,我们的代码又开始工作了。花了一整天的时间首先发现、修复然后测试解决方案。