适用于:  员工租户
 员工租户  外部租户(了解详细信息)
 外部租户(了解详细信息)
在本快速入门中,你将使用示例守护程序应用程序来获取访问令牌,并使用 Microsoft身份验证库(MSAL)调用受保护的 Web API。
在开始之前,请使用此页面顶部的 “选择租户类型 选择器”来选择租户类型。 Microsoft Entra ID 提供两个租户配置, 即员工 和 外部配置。 员工租户配置适用于员工、内部应用和其他组织资源。 外部租户适用于面向客户的应用。
在本快速入门中使用的示例应用将获取访问令牌来调用 Microsoft 图形 API。
先决条件
- 拥有有效订阅的 Azure 帐户。 如果还没有帐户,请 免费创建帐户。
- 此 Azure 帐户必须具有管理应用程序的权限。 以下任何Microsoft Entra 角色都包含所需的权限: - 应用程序管理员
- 应用程序开发人员
- 云应用程序管理员
 
- 员工租户。 可以使用默认目录或 设置新租户。
- 在 Microsoft Entra 管理中心注册新应用, 仅为此组织目录中的帐户配置。 有关更多详细信息 ,请参阅注册应用程序 。 在应用程序 概述 页中记录以下值供以后使用: - 应用程序(客户端)ID
- 目录(租户)ID
 
- 将客户端密码添加到应用注册。 不要 在生产应用中使用客户端机密。 请改用证书或联合凭据。 有关详细信息,请参阅 向应用程序添加凭据。
- . NET 6.0 SDK 的最低要求。
- Visual Studio 2022 或 Visual Studio Code。
向守护程序应用授予 API 权限
若要让守护程序应用访问 Microsoft Graph API 中的数据,请向其授予所需的权限。 守护程序应用需要应用程序类型权限。 用户无法与守护程序应用程序交互,因此租户管理员必须同意这些权限。 使用以下步骤授予和同意权限:
克隆或下载示例应用程序
若要获取示例应用程序,可以从 GitHub 克隆它,也可以将其下载为 .zip 文件。
- 若要克隆示例,请打开命令提示符并导航到要创建项目的位置,并输入以下命令:
git clone https://github.com/Azure-Samples/ms-identity-docs-code-dotnet.git
- 下载 .zip 文件。 将其解压缩到名称长度少于 260 个字符的文件路径。
配置项目
若要在客户端守护程序应用示例中使用应用注册详细信息,请使用以下步骤:
- 打开控制台窗口,然后导航到 ms-identity-docs-code-dotnet/console-daemon 目录: - cd ms-identity-docs-code-dotnet/console-daemon
- 打开 Program.cs ,并将文件内容替换为以下代码片段; - // Full directory URL, in the form of https://login.microsoftonline.com/<tenant_id> Authority = " https://login.microsoftonline.com/Enter_the_tenant_ID_obtained_from_the_Microsoft_Entra_admin_center", // 'Enter the client ID obtained from the Microsoft Entra admin center ClientId = "Enter the client ID obtained from the Microsoft Entra admin center", // Client secret 'Value' (not its ID) from 'Client secrets' in the Microsoft Entra admin center ClientSecret = "Enter the client secret value obtained from the Microsoft Entra admin center", // Client 'Object ID' of app registration in Microsoft Entra admin center - this value is a GUID ClientObjectId = "Enter the client Object ID obtained from the Microsoft Entra admin center"- 
              Authority- 颁发机构是一个 URL,指示 MSAL 可以从中请求令牌的目录。 将 Enter_the_tenant_ID_obtained_from_the_Microsoft_Entra_admin_center 替换为之前记录的 目录(租户)ID 值。
- 
              ClientId- 应用程序的标识符,也称为客户端。 将引号中的文本替换为Application (client) ID之前从已注册应用程序的概述页中记录的值。
- 
              ClientSecret- 在 Microsoft Entra 管理中心为应用程序创建的客户端密码。 输入客户端密码 的值 。
- 
              ClientObjectId- 客户端应用程序的对象 ID。 将引号中的文本替换为Object ID之前从已注册应用程序的概述页记录的值。
 
- 
              
运行并测试应用程序
已配置示例应用。 可以继续运行并测试它。
在控制台窗口中,运行以下命令以生成并运行应用程序:
dotnet run
应用程序成功运行后,它会显示类似于以下代码片段的响应(为简洁起见缩短):
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#applications/$entity",
"id": "00001111-aaaa-2222-bbbb-3333cccc4444",
"deletedDateTime": null,
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"applicationTemplateId": null,
"disabledByMicrosoftStatus": null,
"createdDateTime": "2021-01-17T15:30:55Z",
"displayName": "identity-dotnet-console-app",
"description": null,
"groupMembershipClaims": null,
...
}
工作原理
守护程序应用程序代表自身(而不是代表用户)获取令牌。 用户无法与守护程序应用程序交互,因为它需要自己的标识。 这种类型的应用程序通过使用其应用程序标识来请求访问令牌,方法是显示其应用程序 ID、凭据(机密或证书)和应用程序 ID URI。 守护程序应用程序使用标准的 OAuth 2.0 客户端凭据授予流 来获取访问令牌。
应用从Microsoft标识平台获取访问令牌。 访问令牌的范围适用于 Microsoft 图形 API。 然后,应用使用访问令牌从 Microsoft Graph API 请求自己的应用程序注册详细信息。 只要访问令牌具有正确的权限,应用就可以从 Microsoft 图形 API 请求任何资源。
此示例演示无人参与的作业或 Windows 服务如何使用应用程序标识而不是用户的标识运行。
相关内容
- 通过系列教程构建此 ASP.NET Web 应用,了解如何将 应用程序注册到Microsoft标识平台。 
先决条件
- 拥有有效订阅的 Azure 帐户。 如果还没有帐户,请 免费创建帐户。
- 此 Azure 帐户必须具有管理应用程序的权限。 以下任何Microsoft Entra 角色都包含所需的权限: - 应用程序管理员
- 应用程序开发人员
- 云应用程序管理员
 
- 外部租户。 若要创建一个,请从以下方法中进行选择: - (推荐)使用 Microsoft Entra 外部 ID 扩展 直接在 Visual Studio Code 中设置外部租户。
- 在 Microsoft Entra 管理中心创建新的外部租户。
 
- 使用以下配置在 Microsoft Entra 管理中心 注册新应用。 有关详细信息,请参阅 注册应用程序。
- 名称: ciam-daemon-app
- 支持的帐户类型: 仅此组织目录中的帐户(单租户)
 
- Visual Studio Code 或其他代码编辑器。
- .NET 7.0 或更高版本。
- Node.js (仅适用于节点实现)
创建客户端密码
为已注册的应用程序创建客户端密码。 应用程序在请求令牌时使用客户端密码来证明其标识:
- 从 “应用注册 ”页中,选择你创建的应用程序(如 Web 应用客户端密码)以打开其 “概述 ”页。
- 在“ 管理”下,选择“ 证书和机密>客户端机密>”新建客户端机密。
- 在 “说明 ”框中,输入客户端密码的说明(例如 Web 应用客户端密码)。
- 在 “过期”下,选择机密有效的持续时间(根据组织的安全规则),然后选择“ 添加”。
- 记录机密 的值。 在后面的步骤中,可以使用此值进行配置。 在离开 证书和机密后,不会再次显示机密值,并且无法通过任何方式检索。 请确保记录它。
为机密客户端应用程序创建凭据时:
- Microsoft建议在将应用程序移动到生产环境之前使用证书而不是客户端密码。 有关如何使用证书的详细信息,请参阅 Microsoft标识平台应用程序身份验证证书凭据中的说明。 
- 出于测试目的,可以创建自签名证书,并将应用配置为使用它进行身份验证。 但是, 在生产环境中,应购买由已知证书颁发机构签名的证书,然后使用 Azure Key Vault 来管理证书访问和生存期。 
向守护程序应用授予 API 权限
- 从 “应用注册 ”页中,选择你创建的应用程序,例如 ciam-client-app。 
- 在“管理”下,选择 API 权限。 
- 在 “配置的权限”下,选择“ 添加权限”。 
- 选择 组织使用的 API 选项卡。 
- 在 API 列表中,选择 CIam-ToDoList-api 等 API。 
- 选择 “应用程序权限 ”选项。 我们选择此选项,因为应用以自身身份登录,但不能代表用户登录。 
- 从权限列表中,选择 TodoList.Read.All、ToDoList.ReadWrite.All (如有必要,请使用搜索框)。 
- 选择 “添加权限 ”按钮。 
- 此时,你已正确分配权限。 但是,由于守护程序应用不允许用户与其交互,因此用户本身无法同意这些权限。 若要解决此问题,管理员必须代表租户中的所有用户同意这些权限: - 选择租户名称<的>“授予管理员许可”,然后选择“是”。
- 选择“刷新”,然后验证为租户名称<授予>的权限是否显示在“状态”下。
 
配置应用角色
API 需要为应用程序(也称为 应用程序权限)发布至少一个应用角色,客户端应用才能自行获取访问令牌。 应用程序权限是 API 在希望使客户端应用程序能够以自己身份成功进行身份验证(无需登录用户)时应发布的权限类型。 若要发布应用程序权限,请执行以下步骤:
- 在 “应用注册 ”页中,选择你创建的应用程序(如 ciam-ToDoList-api),以打开其 “概述 ”页。 
- 在“ 管理”下,选择 “应用角色”。 
- 选择“ 创建应用角色”,然后输入以下值,然后选择“ 应用” 保存更改: - 资产 - 价值 - 显示名称 - ToDoList.Read.All - 允许的成员类型 - 应用程序 - 价值 - ToDoList.Read.All - Description - 允许应用使用“TodoListApi”读取每个用户的 ToDo 列表 - 是否要启用此应用角色? - 保持选中状态 
- 再次选择 “创建应用角色 ”,然后输入第二个应用角色的以下值,然后选择“ 应用 ”以保存更改: - 资产 - 价值 - 显示名称 - ToDoList.ReadWrite.All - 允许的成员类型 - 应用程序 - 价值 - ToDoList.ReadWrite.All - Description - 允许应用使用“ToDoListApi”读取和写入每个用户的 ToDo 列表 - 是否要启用此应用角色? - 保持选中状态 
配置可选声明
可以添加 idtyp 可选声明来帮助 Web API 确定令牌是 应用 令牌还是 应用 + 用户 令牌。 尽管可以将 scp 和 角色 声明的组合用于相同的目的,但使用 idtyp 声明是告知应用令牌和应用 + 用户令牌的最简单的方法。 例如,当令牌是仅限应用的令牌时,此声明的值是 应用 。
克隆或下载示例守护程序应用程序和 Web API
若要获取示例应用程序,可以从 GitHub 克隆它,也可以将其下载为 .zip 文件。
- 若要克隆示例,请打开命令提示符并导航到要创建项目的位置,并输入以下命令: - git clone https://github.com/Azure-Samples/ms-identity-ciam-javascript-tutorial.git
- 或者, 下载示例 .zip 文件,然后将其提取到名称长度少于 260 个字符的文件路径。 
安装项目依赖项
- 打开控制台窗口,并更改为包含 Node.js 示例应用的目录: - cd 2-Authorization\3-call-api-node-daemon\App
- 运行以下命令以安装应用依赖项: - npm install && npm update
配置示例守护程序应用和 API
若要在客户端 Web 应用示例中使用应用注册详细信息,请使用以下步骤:
- 在代码编辑器中,打开 - App\authConfig.js文件。
- 查找占位符: - Enter_the_Application_Id_Here并将其替换为之前注册的守护程序应用的应用程序(客户端)ID。
- Enter_the_Tenant_Subdomain_Here并将其替换为 Directory (tenant) 子域。 例如,如果租户主域为- contoso.onmicrosoft.com,请使用- contoso。 如果没有租户名称,请了解如何 阅读租户详细信息。
- Enter_the_Client_Secret_Here并将其替换为之前复制的守护程序应用机密值。
- Enter_the_Web_Api_Application_Id_Here并将其替换为前面复制的 Web API 的应用程序(客户端)ID。
 
若要在 Web API 示例中使用应用注册,请执行以下作:
- 在代码编辑器中,打开 - API\ToDoListAPI\appsettings.json文件。
- 查找占位符: - Enter_the_Application_Id_Here并将其替换为复制的 Web API 的应用程序(客户端)ID。
- Enter_the_Tenant_Id_Here并将其替换为之前复制的目录(租户)ID。
- Enter_the_Tenant_Subdomain_Here并将其替换为 Directory (tenant) 子域。 例如,如果租户主域为- contoso.onmicrosoft.com,请使用- contoso。 如果没有租户名称,请了解如何 阅读租户详细信息。
 
运行和测试示例守护程序应用和 API
已配置示例应用。 可以继续运行并测试它。
- 打开控制台窗口,然后使用以下命令运行 Web API: - cd 2-Authorization\3-call-api-node-daemon\API\ToDoListAPI dotnet run
- 使用以下命令运行 Web 应用客户端: - 2-Authorization\3-call-api-node-daemon\App node . --op getToDos
如果守护程序应用和 Web API 成功运行,则应在控制台窗口中看到类似于以下 JSON 数组的内容
{
    "id": 1,
    "owner": "3e8....-db63-43a2-a767-5d7db...",
    "description": "Pick up grocery"
},
{
    "id": 2,
    "owner": "c3cc....-c4ec-4531-a197-cb919ed.....",
    "description": "Finish invoice report"
},
{
    "id": 3,
    "owner": "a35e....-3b8a-4632-8c4f-ffb840d.....",
    "description": "Water plants"
}
工作原理
Node.js 应用使用 OAuth 2.0 客户端凭据授予流 来为自己获取访问令牌,而不是为用户获取访问令牌。 应用请求的访问令牌包含表示为角色的权限。 客户端凭据流使用这组权限来代替应用程序令牌的用户范围。 之前在 Web API 中 公开了这些应用程序权限 ,然后将其 授予守护程序应用。
在 API 端,示例 .NET Web API 必须验证访问令牌是否具有所需的权限(应用程序权限)。 Web API 不接受没有所需权限的访问令牌。
对数据的访问
Web API 终结点应准备好接受来自用户和应用程序的调用。 因此,它应该有一种方法来相应地响应每个请求。 例如,通过委托的权限/范围从用户发出的调用接收用户的数据 to-do 列表。 另一方面,通过应用程序权限/角色从应用程序发出的调用可能会接收整个 to-do 列表。 但是,在本文中,我们只是进行应用程序调用,因此我们不需要配置委派的权限/范围。