迁移用于Microsoft Graph 的 .NET 客户端库

本文是 Azure AD Graph 应用迁移规划清单系列中的步骤 3:查看应用详细信息的一部分。

如果应用当前使用 Azure Active Directory (Azure AD) Graph 客户端库,请切换到 Microsoft Graph .NET 客户端库

本文介绍了迁移到 Microsoft Graph .NET 客户端库的以下常规步骤:

  • 如何创建Microsoft Graph 客户端,给定访问令牌 (,可以使用 Azure Active Directory 身份验证库 (ADAL) 或Microsoft身份验证库 (MSAL) )
  • 如何表述请求
  • 如何使用查询生成器
  • 如何处理集合和分页

迁移步骤概述

以下步骤假定应用使用 ADAL 获取访问令牌来调用 Azure AD Graph。 切换到 MSAL 可以作为 迁移到 MSAL 中所述的单独步骤完成。

更新资源 URL

若要获取 Microsoft Graph 的访问令牌,请更新 resourceUrl

从:

https://graph.windows.net

收件人:

https://graph.microsoft.com

更新引用

在应用中,通过更改以下作来更新对 Microsoft Graph 客户端库的引用:

从:

using Microsoft.Azure.ActiveDirectory.GraphClient;

收件人:

using Microsoft.Graph;

更新包和依赖项

使用包管理器下载和更新 Microsoft Graph NuGet 包 和更新依赖项。

更新客户端构造函数

更新客户端构造函数以创建 GraphServiceClient 而不是 ActiveDirectoryClient。 以下代码片段假定应用使用 AcquireTokenAsyncForUser() 方法获取新令牌。 可以在 active-directory-dotnet-graphapi-console 示例中找到此方法的定义。

从:

ActiveDirectoryClient client = new ActiveDirectoryClient(serviceRoot,
async () => await AcquireTokenAsyncForUser());

收件人:

GraphServiceClient graphClient = new GraphServiceClient(serviceRoot,
    new DelegateAuthenticationProvider(async (requestMessage) => {
        var token = await AcquireTokenAsyncForUser();
        requestMessage.Headers.Authorization = new
            AuthenticationHeaderValue("bearer", token);
    }));

对于 Microsoft Graph 客户端库, serviceRoot 该值还包括版本号。 目前,该值为 https://graph.microsoft.com/v1.0

更新请求语法

通过更改以下方法更新请求以使用 Microsoft Graph 客户端请求生成器语法:

从:

signedInUser = (User)await client.Me.ExecuteAsync();

收件人:

signedInUser = (User)await client.Me.Request().GetAsync();

Azure AD Graph 客户端库支持基于 LINQ 的查询语法。 但是,Microsoft Graph 客户端库不会。 因此,需要将相关查询转换为更 RESTful 表达式。 为此,请更改:

从:

var groups = await
client.Groups.Where(g => g.DisplayName.StartsWith("a")).ExecuteAsync();

收件人:

var groups = await
client.Groups.Request().Filter("startswith(displayName,'a')").GetAsync();

处理集合和分页

如果代码页通过集合,则需要进行调整。 以下示例对提取组和对其成员进行分页(一次 5 个)进行比较和对比。 虽然 Azure AD Graph 的代码需要提取器构造来提取组的成员,但 Microsoft Graph 没有此类要求。 代码被截断并仅显示用户成员、try/catch 和错误条件不显示,并且代码片段适用于单线程控制台应用。

例如,使用 Azure AD Graph .NET 客户端库更改以下代码:

Group retrievedGroup = client.Groups.
    Where(g => g.ObjectId.Equals(id)).ExecuteAsync().Result;
IGroupFetcher retrievedGroupFetcher = (IGroupFetcher) retrievedGroup;

var membersPage = retrievedGroupFetcher.Members.Take(5).ExecuteAsync().Result;
Console.WriteLine(" Members:");
do
{
    List<IDirectoryObject> members = membersPage.CurrentPage.ToList();
    foreach (IDirectoryObject member in members)
    {
        if (member is User)
        {
            User memberUser = (User)member;
            Console.WriteLine("        User: {0} ", memberUser.DisplayName);
        }
    }
    membersPage = membersPage.GetNextPageAsync().Result;
} while (membersPage != null);

使用 Microsoft Graph .NET 客户端库的以下代码:

var membersPage = client.Groups[id].Members.Request().Top(5).GetAsync().Result;
Console.WriteLine(" Members:");
do
{
    List<DirectoryObject> members = membersPage.CurrentPage.ToList();
    foreach (DirectoryObject member in members)
    {
        if (member is User)
        {
            User memberUser = (User)member;
            Console.WriteLine("        User: {0} ", memberUser.DisplayName);
        }
    }
    if (membersPage.NextPageRequest != null)
        membersPage = membersPage.NextPageRequest.GetAsync().Result;
    else membersPage = null;
} while (membersPage != null);

测试、验证、解析

生成并修复与名称更改相关的任何资源、属性、导航和服务作错误。

资源

  • C# 控制台代码片段应用突出显示了 Microsoft Graph 客户端库与 Azure AD Graph 客户端库之间的更多差异。
  • Azure AD Graph 客户端库仅支持 .NET 平台。 但是,Microsoft Graph 客户端库支持其他 平台和语言

后续步骤