快速入门:使用控制台应用的标识获取令牌并调用 Microsoft Graph API

欢迎使用! 这可能不是你期望看到的页面。 在修复时,此链接应会将你转至正确的文章:

快速入门:在 .NET 控制台应用中获取获取令牌并调用 Microsoft Graph

对于因此而造成的不便,我们深表歉意。感谢你的耐心等待,我们正在努力解决此问题。

以下快速入门使用一个代码示例来演示 .NET 控制台应用程序如何获取访问令牌以调用 Microsoft Graph API,并在目录中显示用户列表。 它还演示作业或 Windows 服务如何使用应用程序标识而不是用户标识运行。 本快速入门中的示例控制台应用程序也是一个守护程序应用程序,因此它是机密的客户端应用程序。

先决条件

最低要求 .NET 6.0 SDK

下载并配置快速入门应用

步骤 1:在 Azure 门户中配置应用程序

为使本快速入门的代码示例正常运行,请创建客户端机密,并添加图形 API 的 User.Read.All 应用程序权限。

Already configured 应用程序已使用这些属性进行配置。

步骤 2:下载 Visual Studio 项目

使用 Visual Studio 2022 运行项目。

提示

若要避免由于 Windows 中路径长度限制导致的错误,我们建议将存档提取或克隆到驱动器根目录附近的目录中。

注意

Enter_the_Supported_Account_Info_Here

现在运行该应用程序会生成输出 HTTP 403 - Forbidden* error: "Insufficient privileges to complete the operation。 之所以出现这种错误,是因为任何仅限应用的权限都需要目录的全局管理员为应用程序授予同意。 根据角色选择以下选项之一。

全局租户管理员

全局租户管理员请转到“API 权限”页面,选择“为 Enter_the_Tenant_Name_Here 授予管理员同意”。

标准用户

租户的标准用户可以请求全局管理员为应用程序授予管理员同意。 为此,请为管理员提供以下 URL:

https://login.partner.microsoftonline.cn/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

在使用上述 URL 为应用授予同意后,可能会显示错误“AADSTS50011: No reply address is registered for the application”。 之所以出现此错误,是因为此应用程序和 URL 没有重定向 URI。 这可予以忽视。

步骤 4:运行应用程序

在 Visual Studio 中,按 F5 运行应用程序。 否则,请通过命令提示符、控制台或终端运行该应用程序:

cd {ProjectFolder}\1-Call-MSGraph\daemon-console
dotnet run

在该代码中:

  • {ProjectFolder} 是在其中解压缩了 zip 文件的文件夹。 示例为 C:\Azure-Samples\active-directory-dotnetcore-daemon-v2

结果应显示 Microsoft Entra ID 中的用户列表。

本快速入门应用程序使用客户端机密将自己标识为机密客户端。 客户端机密以纯文本文件的形式添加到项目文件中。 为了安全起见,建议在考虑将应用程序用作生产应用程序之前,使用证书来代替客户端机密。 若要详细了解如何使用证书,请参阅这些说明

详细信息

本部分概述了使用户登录所需的代码。 此概述有助你了解 > 代码的工作原理、主要参数是什么,以及如何向现有 .NET 控制台应用程序添加登录。

示例工作原理

Diagram that shows how the sample app generated by this quickstart works.

Microsoft.Identity.Web.GraphServiceClient

Microsoft Identity Web(在 Microsoft.Identity.Web.TokenAcquisition 包中)是一个库,用于请求访问受 Microsoft 标识平台保护的 API 的令牌。 本快速入门请求令牌的方法是使用应用程序自身的标识而不是委托的权限。 此示例中的身份验证流称为客户端凭据 OAuth 流。 若要详细了解如何将 MSAL.NET 与客户端凭据流配合使用,请参阅此文。 鉴于本快速入门中的守护程序应用调用了 Microsoft Graph,请安装 Microsoft.Identity.Web.GraphServiceClient 包,它可处理针对 Microsoft Graph 的已自动完成身份验证的请求(并引用自身 Microsoft.Identity.Web.TokenAcquisition)

可在 Visual Studio 包管理器控制台中运行以下命令来安装 Microsoft.Identity.Web.GraphServiceClient:

dotnet add package Microsoft.Identity.Web.GraphServiceClient

应用程序初始化

通过添加以下代码来添加对 Microsoft.Identity.Web 的引用:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Graph;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;

然后,使用以下代码初始化应用:

// Get the Token acquirer factory instance. By default it reads an appsettings.json
// file if it exists in the same folder as the app (make sure that the 
// "Copy to Output Directory" property of the appsettings.json file is "Copy if newer").
TokenAcquirerFactory tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();

// Configure the application options to be read from the configuration
// and add the services you need (Graph, token cache)
IServiceCollection services = tokenAcquirerFactory.Services;
services.AddMicrosoftGraph();
// By default, you get an in-memory token cache.
// For more token cache serialization options, see https://aka.ms/msal-net-token-cache-serialization

// Resolve the dependency injection.
var serviceProvider = tokenAcquirerFactory.Build();

此代码使用 appsettings.json 文件中定义的配置:

{
   "AzureAd": {
       "Instance": "https://login.partner.microsoftonline.cn/",
       "TenantId": "[Enter here the tenantID or domain name for your Azure AD tenant]",
       "ClientId": "[Enter here the ClientId for your application]",
       "ClientCredentials": [
           {
              "SourceType": "ClientSecret",
              "ClientSecret": "[Enter here a client secret for your application]"
           }
       ]
   }
}
元素 说明
ClientSecret 在 Azure 门户中为应用程序创建的客户端机密。
ClientId 在 Azure 门户中注册的应用程序的应用程序(客户端)ID。 可以在 Azure 门户的应用的“概述”页上找到此值。
Instance (可选)安全令牌服务 (STS) 可以提供终结点实例以便应用进行身份验证。 对于公共云,通常为 https://login.partner.microsoftonline.cn/
TenantId 租户的名称或租户 ID。

有关详细信息,请查看 ConfidentialClientApplication 的参考文档

调用 Microsoft Graph

若要使用应用的标识来请求令牌,请使用 AcquireTokenForClient 方法:

GraphServiceClient graphServiceClient = serviceProvider.GetRequiredService<GraphServiceClient>();
var users = await graphServiceClient.Users
              .GetAsync(r => r.Options.WithAppOnly());

帮助和支持

如果需要帮助、需要报告问题,或者需要详细了解支持选项,请参阅面向开发人员的帮助和支持

后续步骤

若要详细了解守护程序应用程序,请参阅方案概述: