繁体   English   中英

Azure AD图:此平台不支持安全二进制序列化

[英]Azure AD Graph: Secure binary serialization is not supported on this platform

我们在.NET Core 2.1上运行, 有时在运行以下查询时会出现异常“此平台不支持安全二进制序列化”:

await _adClient.Users[userId].AppRoleAssignments.ExecuteAsync();

重新执行查询通常是可行的,因此是否满足某些条件,在该条件下,后续请求没有尝试(或成功?)二进制序列化? 就是说,如果我重新启动该服务,它通常也可以处理第一个请求。

我们使用的是较旧的AD Graph客户端,因为1)Microsoft Graph客户端尚不完全支持AppRoleAssignments ,并且2)受支持的内容是beta的一部分,不建议用于生产。

下面是完整的调用堆栈:

System.Data.Services.Client.BaseAsyncResult.EndExecute<T>(object source, string method, IAsyncResult asyncResult)
System.Data.Services.Client.QueryResult.EndExecuteQuery<TElement>(object source, string method, IAsyncResult asyncResult)
System.Data.Services.Client.DataServiceRequest.EndExecute<TElement>(object source, DataServiceContext context, string method, IAsyncResult asyncResult)
System.Data.Services.Client.DataServiceQuery<TElement>.EndExecute(IAsyncResult asyncResult)
Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper+<>c__DisplayClass4c<TSource, TInterface>.<ExecuteAsync>b__4a(IAsyncResult r)
System.Threading.Tasks.TaskFactory<TResult>.FromAsyncCoreLogic(IAsyncResult iar, Func<IAsyncResult, TResult> endFunction, Action<IAsyncResult> endAction, Task<TResult> promise, bool requiresSynchronization)
Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper.ExecuteAsync<TSource, TInterface>(DataServiceQuery<TSource> inner)
Microsoft.Azure.ActiveDirectory.GraphClient.AppRoleAssignmentCollection.<ExecuteAsync>b__2()
Merck.SeaMonkey.Api.AzureADApi.Controllers.UserController.GetApplicationRoleAssignments(string userId) in UserController.cs

新的Microsoft Graph客户端不是这里的选项,尽管我想我们可以下拉到基本REST接口,这与我们依赖于图客​​户端的所有重试逻辑,结果解析等有关。去做。

更新:给出异常的来源,我们假设在OData响应中序列化实体时存在问题。 不过,使用AD Graph Explorer,我们可以看到一个非常简单的响应,其中包含一个空值数组以及指向该实体的元数据文档的链接。 我们经常通过删除和添加新的应用程序角色分配来使此问题再次发生,但是我们不能强迫它100%可靠地发生。 看起来某些状态已损坏,也许在某些内部缓存中?

我经常使用该api调用-但是我对旧图使用直接rest httpClient调用。

我仅将此作为参考发布-请注意url(1.6)上的显式版本。 我还将发布反序列化的对象,这可能与官方对象架构不匹配。

    // OLD Graph End point    //  like ... https://graph.windows.net/{tenant-id}/users/{id}/appRoleAssignments?api-version=1.6
   urlUserInviteToUse = "https://graph.windows.net/" + m_CfgHlp.TenIdInB2C + "/" + ObjFamilyName + "/" + DirObjIdToGet + "/" + ObjFunctionCall + "?api-version=1.6";

由于其余的api字符串有效负载,我有效地使用了JsonConvert.DeserializeObject从有效负载转到对象类。 请注意,日期未反序列化为日期。

public class AppRoleAssignmentsRoot
{
    public string odatametadata { get; set; }
    public AppRoleAssignment[] value { get; set; }
}

public class AppRoleAssignment
{
    public string odatatype { get; set; }
    public string objectType { get; set; }
    public string objectId { get; set; }
    public object deletionTimestamp { get; set; }
    public object creationTimestamp { get; set; }
    public string id { get; set; }
    public string principalDisplayName { get; set; }
    public string principalId { get; set; }
    public string principalType { get; set; }
    public string resourceDisplayName { get; set; }
    public string resourceId { get; set; }
}

暂无
暂无

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

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