可将用户登录的 Web 应用:代码配置

本文介绍了如何为可将用户登录的 Web 应用配置代码。

支持 Web 应用的 Microsoft 库

以下 Microsoft 库用于保护 Web 应用(和 Web API):

语言/框架 项目
GitHub
获取
入门
用户登录 访问 Web API 正式发布 (GA) 或
公共预览版1
.NET MSAL.NET Microsoft.Identity.Client 库无法为用户登录请求 ID令牌。 库可以为受保护的 Web API 请求访问令牌。 乔治亚州
.NET Microsoft.IdentityModel Microsoft.IdentityModel 图书馆无法请求用户登录的ID令牌。 2 库无法请求受保护的Web API的访问令牌。 2 乔治亚州
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web 快速入门 库可以为用户登录请求 ID令牌。 库可以为受保护的 Web API 请求访问令牌。 乔治亚州
爪哇岛 MSAL4J msal4j 快速入门 库可以为用户登录请求 ID令牌。 库可以为受保护的 Web API 请求访问令牌。 乔治亚州
春天 spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory 教程 库可以为用户登录请求 ID令牌。 库可以为受保护的 Web API 请求访问令牌。 乔治亚州
Node.js MSAL 节点 msal-node 快速入门 库可以为用户登录请求 ID令牌。 库可以为受保护的 Web API 请求访问令牌。 乔治亚州
Python语言 MSAL Python msal 库可以为用户登录请求 ID令牌。 库可以为受保护的 Web API 请求访问令牌。 乔治亚州
Python语言 身份 身份 快速入门 库可以为用户登录请求 ID令牌。 库可以为受保护的 Web API 请求访问令牌。 --

(1)联机服务通用许可条款适用于公共预览版的库

(2)Microsoft.IdentityModel 库仅验证令牌,它不能请求 ID 或访问令牌。

选择与所需平台对应的选项卡:

本文中的代码片段及以下内容摘自以 MSAL Node 编写的登录用户的 Node.js Web 应用程序示例。

你可能需要参考此示例来了解完整的实现细节。

配置文件

使用 Microsoft 标识平台将用户登录的 Web 应用程序是通过配置文件配置的。 这些文件必须指定以下值:

  • 实例(例如,如果需要在国家云中运行应用)。 不同的选项包括:
    • https://login.partner.microsoftonline.cn/common:中国 Microsoft Entra(由世纪互联运营)
  • 租户 ID 中的受众。 选项根据应用是单租户还是多租户而异。
    • 从 Azure 门户获取的租户 GUID,用于将组织中的用户登录。 也可以使用域名。
    • organizations,让用户使用任何工作或学校帐户登录
    • common,让用户使用任何工作或学校帐户登录
  • 应用程序的客户端 ID,从 Azure 门户中复制

还可能会看到对颁发机构的引用、实例租户 ID 值的串联。

此处,配置参数以环境变量的形式驻留在 .env.dev 中:

CLOUD_INSTANCE="Enter_the_Cloud_Instance_Id_Here" # cloud instance string should end with a trailing slash
TENANT_ID="Enter_the_Tenant_Info_Here"
CLIENT_ID="Enter_the_Application_Id_Here"
CLIENT_SECRET="Enter_the_Client_Secret_Here"

REDIRECT_URI="http://localhost:3000/auth/redirect"
POST_LOGOUT_REDIRECT_URI="http://localhost:3000"

GRAPH_API_ENDPOINT="Enter_the_Graph_Endpoint_Here" # graph api endpoint string should end with a trailing slash

EXPRESS_SESSION_SECRET="Enter_the_Express_Session_Secret_Here"

这些参数用于在 authConfig.js 文件中创建配置对象,最终将用于初始化 MSAL 节点:

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */

require('dotenv').config({ path: '.env.dev' });

/**
 * Configuration object to be passed to MSAL instance on creation.
 * For a full list of MSAL Node configuration parameters, visit:
 * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/configuration.md
 */
const msalConfig = {
    auth: {
        clientId: process.env.CLIENT_ID, // 'Application (client) ID' of app registration in Azure portal - this value is a GUID
        authority: process.env.CLOUD_INSTANCE + process.env.TENANT_ID, // Full directory URL, in the form of https://login.partner.microsoftonline.cn/<tenant>
        clientSecret: process.env.CLIENT_SECRET // Client secret generated from the app registration in Azure portal
    },
    system: {
        loggerOptions: {
            loggerCallback(loglevel, message, containsPii) {
                console.log(message);
            },
            piiLoggingEnabled: false,
            logLevel: 3,
        }
    }
}

const REDIRECT_URI = process.env.REDIRECT_URI;
const POST_LOGOUT_REDIRECT_URI = process.env.POST_LOGOUT_REDIRECT_URI;
const GRAPH_ME_ENDPOINT = process.env.GRAPH_API_ENDPOINT + "v1.0/me";

module.exports = {
    msalConfig,
    REDIRECT_URI,
    POST_LOGOUT_REDIRECT_URI,
    GRAPH_ME_ENDPOINT
};

在 Azure 门户中,在应用程序的“身份验证”页中注册的回复 URI 需与应用程序定义的 redirectUri 实例 (http://localhost:3000/auth/redirect) 相匹配。

在本文中,为简单起见,客户端机密存储在配置文件中。 在生产应用中,请考虑使用密钥保管库或环境变量。 更好的选择是使用证书。

初始化代码

初始化代码的差异与平台相关。 对于 ASP.NET Core 和 ASP.NET,用户登录将委托给 OpenID Connect 中间件来完成。 ASP.NET 或 ASP.NET Core 模板会为 Azure AD v1.0 终结点生成 Web 应用程序。 只需进行一些配置就能使这些应用程序适应 Microsoft 标识平台。

节点示例使用 Express 框架。 MSAL 在 auth 路由处理程序中初始化:

var express = require('express');

const authProvider = require('../auth/AuthProvider');
const { REDIRECT_URI, POST_LOGOUT_REDIRECT_URI } = require('../authConfig');

const router = express.Router();

router.get('/signin', authProvider.login({
    scopes: [],
    redirectUri: REDIRECT_URI,
    successRedirect: '/'

下一步