Azure Active Directory 图形客户端 2.0

Posted

技术标签:

【中文标题】Azure Active Directory 图形客户端 2.0【英文标题】:Azure Active Directory Graph Client 2.0 【发布时间】:2014-12-27 13:52:03 【问题描述】:

有人使用新的 2.0 版 Azure AD Graph 客户端吗?

我昨天开始玩弄它,但无法让它工作。 GraphConnection 类被标记为已弃用并替换为 ActiveDirectoryClient。此外,突然间全部是 Office 365,而我只想将我的试用版限制在没有 O365 的 Azure Active Directory 上。文档很难找到,至少当您不想使用 O365 和 O365 API 工具时。 GitHub 上的 AD 示例似乎也已更新,但代码仍在使用 GraphConnection 类。去图吧。

关于使用 ActiveDirectory 客户端的示例/指导还没有太多,所以下面的代码暂时使用

public async Task<ActionResult> Index()
        
            List<Exception> exceptions = new List<Exception>();
            ProfileViewModel model = new ProfileViewModel();
            string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
            AuthenticationContext authContext = new AuthenticationContext(SecurityConfiguration.Authority, new NaiveSessionCache(userObjectID));
            ClientCredential credential = new ClientCredential(SecurityConfiguration.ClientId, SecurityConfiguration.AppKey);

            try
            
                var ServiceUri = new Uri(SecurityConfiguration.GraphUrl);
                ActiveDirectoryClient client = new ActiveDirectoryClient(ServiceUri, async () =>
                
                    var result = await authContext.AcquireTokenSilentAsync(SecurityConfiguration.GraphUrl, credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));

                    return result.AccessToken;
                );
                try
                

                    var users = await client.Users.ExecuteAsync();

                    var user = await client.Users[userObjectID].ExecuteAsync();


                
                catch (Exception exc) 
                
                    exceptions.Add(exc);
                


            
            catch (AdalSilentTokenAcquisitionException exc)
            
                exceptions.Add(exc);

            
            ViewBag.Exceptions = exceptions;
            return View(model);
        

client.Users.ExecuteAsync() 抛出异常

响应负载是无效响应负载。请确保***元素是有效的 Atom 或 JSON 元素或属于“http://schemas.microsoft.com/ado/2007/08/dataservices”命名空间。

client.Users[userObjectID].ExecuteAsync() 抛出

System.Reflection.TargetInvocationException 与 Innerexpection 需要一个没有查询或片段的相对 URL 路径。 参数名称:entitySetName

2/11 更新

诡异的分辨率:无需更改一行代码client.Users.ExecuteAsync() 按预期工作。我的想法是 MSFT 的人员更改了 API 上的一些内容,以便响应有效负载现在是正确的。他们本可以提到这一点。

使用下面的 v2.0 代码获取用户详细信息就可以了

var userFetcher = client.Users.Where(u => u.ObjectId == userObjectID);
var user = await userFetcher.ExecuteAsync();

如果您使用 razor 显示用户的内容,则在尝试通过 AssignedPlans 等集合时可能会遇到 razor 异常

“System.Object”类型是在未引用的程序集中定义的。您必须添加对程序集“System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用。

解决方案是更改 web.config 中的编译设置,如 http://www.lyalin.com/2014/04/25/the-type-system-object-is-defined-in-an-assembly-that-is-not-reference-mvc-pcl-issue/ 中所述

<compilation debug="true" targetFramework="4.5" >
      <assemblies>
        <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </assemblies>
    </compilation>

【问题讨论】:

我们最近发现 AAD 非常非常令人沮丧。我们目前遇到了各种各样的问题,特别是关于 ZUMO,并在少数博客和 SO 上寻找解决方案......官方文档中没有提到任何内容。如果您没有完全按照 MS 的教程进行操作,那么您就是在大打出手。 【参考方案1】:

用于通过 Id 检索用户实体,而不是:

var userFetcher = client.Users.Where(u => u.ObjectId == userObjectID); 
var user = await userFetcher.ExecuteAsync();

你可以直接使用getByObjectId:

var user = await client.Users.GetByObjectId(userObjectID).ExecuteAsync();

【讨论】:

以上是关于Azure Active Directory 图形客户端 2.0的主要内容,如果未能解决你的问题,请参考以下文章

使用 Active Directory 图形客户端删除 AAD B2C 中的用户

如何强制Azure Active Directory身份验证服务重新发出带有更新声明的id_token?

Azure B2C 来宾(外部 Azure Active Directory)X 成员(联合 Azure Active Directory)

Azure-Azure Active Directory(AAD)

text Azure Active Directory身份验证

Azure *** 客户端 Azure Active Directory 身份验证