在示例 Python Django Web 应用程序中登录用户

在本指南中,你将探索由 Microsoft Entra 外部 ID 保护的 Python Django Web 应用。 此示例将引导你完成向 Python Django Web 应用进行身份验证的客户登录体验。 该示例 Web 应用使用适用于 Python 的 Microsoft 身份验证库 (MSAL Python) 来处理用户身份验证。

先决条件

注册 Web 应用

若要使应用程序能够让用户通过 Microsoft Entra 登录,必须让 Microsoft Entra 外部 ID 能够感知你创建的应用程序。 应用注册会在应用与 Microsoft Entra 之间建立信任关系。 注册应用程序时,外部 ID 会生成一个称为“应用程序(客户端)ID”的唯一标识符,该值用于在创建身份验证请求时标识应用。

以下步骤演示如何在 Microsoft Entra 管理中心注册应用:

  1. 至少以应用程序开发人员的身份登录到 Microsoft Entra 管理中心

  2. 如果你有权访问多个租户,请使用顶部菜单中的“设置”图标 ,通过“目录 + 订阅”菜单切换到你的外部租户

  3. 浏览到“标识”>“应用程序”>“应用注册”。

  4. 选择“+ 新建注册”。

  5. 在显示的“注册应用程序”页中;

    1. 输入一个向应用用户显示的、有意义的应用程序名称,例如 ciam-client-app
    2. 在“支持的帐户类型”下,选择“仅此组织目录中的帐户” 。
  6. 选择“注册”。

  7. 成功注册后,会显示应用程序的“概述”窗格。 记录要在应用程序源代码中使用的应用程序(客户端)ID

若要为应用注册指定应用类型,请执行以下步骤:

  1. 在“管理”下,选择“身份验证”
  2. 在“平台配置”页上,选择“添加平台”,然后选择“Web”选项。
  3. 对于“重定向 URI”,请输入 http://localhost:5000/redirect。 此重定向 URI 是授权服务器发送访问令牌的位置。 可以自定义它以满足你的用例。
  4. 选择“配置”以保存更改。

添加应用客户端机密

为注册的应用创建客户端机密。 应用程序在请求令牌时使用客户端密码来证明其身份。

  1. 从“应用注册”页中,选择创建的应用程序(例如 ciam-client-app)以打开其“概述”页。
  2. 在“管理”下,选择“证书和机密”
  3. 选择“新建客户端机密”。
  4. 在“说明”框中输入对客户端密码的说明(如 ciam 应用客户端密码)。
  5. 在“过期时间”下,选择密码的有效期(根据组织的安全规则),然后选择“添加”。
  6. 记下机密的“值”。 在稍后的步骤中将使用此值进行配置。 离开“证书和机密”后,机密值不会再次显示,并且无法以任何方式检索。 请确保记录它。
  1. 从“应用注册”页中,选择创建的应用程序(例如 ciam-client-app)以打开其“概述”页。

  2. 在“管理”下选择“API 权限” 。 在“已配置的权限”列表中,应用程序已被分配 User.Read 权限。 但是,由于该租户是外部租户,因此使用者用户本身不能同意此权限。 作为管理员,你必须代表租户中的所有用户同意此权限:

    1. 选择“为 <租户名称> 授予管理员同意”,然后选择“是”。
    2. 选择“刷新”,然后验证两个范围的“状态”下是否均显示“已为 <租户名称> 授予”。

创建用户流

按照这些步骤创建可供客户用于登录或注册应用程序的用户流。

  1. 至少以外部 ID 用户流管理员身份登录到 Microsoft Entra 管理中心

  2. 如果你有权访问多个租户,请使用顶部菜单中的“设置”图标 ,通过“目录 + 订阅”菜单切换到你的外部租户

  3. 浏览到“标识”>“外部标识”>“用户流”。

  4. 选择“+ 新建用户流”。

  5. 在“创建”页上执行以下操作:

    1. 为用户流输入名称,例如 SignInSignUpSample。

    2. 在“标识提供者”列表中,选择“电子邮件帐户”。 此标识提供者使用户能够使用其电子邮件地址登录或注册。

      注意

      只有在设置了与额外的标识提供者的联合身份验证之后,才会在此处列出这些标识提供者。 例如,如果设置了与 GoogleFacebook 的联合身份验证,则能够在此处选择这些额外的标识提供者。

    3. 在“电子邮件帐户”下,可以选择两个选项之一。 对于本教程,请选择“电子邮件和密码”。

      • 电子邮件和密码:使新用户能够使用电子邮件地址作为登录名称并使用密码作为其第一重身份验证凭据进行注册和登录。
      • 电子邮件一次性密码:使新用户能够使用电子邮件地址作为登录名称并使用电子邮件一次性密码作为其第一重身份验证凭据进行注册和登录。 只有在租户级别启用电子邮件一次性密码(“所有标识提供者”>“电子邮件一次性密码”),才能在用户流级别使用此选项。
    4. 在“用户属性”下,选择要在用户注册时收集的用户属性。 选择“显示更多内容”即可选择“国家/地区”、“显示名称”和“邮政编码”的属性和声明。 选择“确定” 。 (系统仅在用户首次注册时提示输入属性。)

  6. 选择“创建” 。 此时,新的用户流将显示在“用户流”列表中。 如果需要,请刷新页面。

若要启用自助式密码重置,请使用启用自助式密码重置一文中的步骤。

将 Web 应用程序与用户流相关联

尽管许多应用程序可与用户流相关联,但单个应用程序只能与一个用户流相关联。 用户流允许为特定应用程序配置用户体验。 例如,可以配置一个要求用户使用电子邮件地址登录或注册的用户流。

  1. 在边栏菜单中选择“标识”。

  2. 依次选择“外部标识”和“用户流”。

  3. 在“用户流”页中,选择之前创建的用户流名称,例如 SignInSignUpSample。

  4. 在“使用”下,选择“应用程序”。

  5. 选择“添加应用程序”。

  6. 从列表中选择应用程序(如 ciam-client-app),或使用搜索框查找应用程序,然后将其选中。

  7. 选择“选择”。

克隆或下载示例 Web 应用程序

若要获取示例应用程序,可以从 GitHub 克隆它或将其下载为 .zip 文件。

  • 若要克隆示例,请打开命令提示符并导航到要创建项目的位置,然后输入以下命令:

    git clone https://github.com/Azure-Samples/ms-identity-docs-code-python.git
    
  • 下载 .zip 文件。 将其提取到名称长度小于 260 个字符的文件路径。

安装项目依赖项

  1. 打开控制台窗口,更改为包含 Flask 示例 Web 应用的目录:

    cd django-web-app
    
  2. 设置虚拟环境

    py -m venv .venv
    .venv\scripts\activate
    
  3. 运行以下命令以安装应用依赖项:

    python3 -m pip install -r requirements.txt
    

配置示例 Web 应用

  1. 在 Visual Studio Code 或正在使用的编辑器上打开项目文件。

  2. 参照 .env.sample 文件,在项目的根文件夹中创建 .env 文件

  3. 在 .env 文件中,提供以下环境变量:

    1. CLIENT_ID,它是你之前注册的应用的应用程序(客户端)ID。
    2. CLIENT_SECRET,它是你之前复制的应用机密值。
    3. AUTHORITY,它是标识令牌颁发机构的 URL。 它的格式应为 https://{subdomain}.ciamlogin.com/{subdomain}.onmicrosoft.com。 将子域替换为目录(租户)子域。 例如,如果租户主域为 contoso.onmicrosoft.com,请使用 contoso。 如果没有租户子域,请了解如何读取租户详细信息
    4. REDIRECT_URI,它应类似于你之前注册的重定向 URI,应与你的配置匹配。

运行和测试示例 Web 应用

运行应用以查看实践中的登录体验。

注意

此示例使用 Python 标识第三方库。 该库不是由 Microsoft 正式维护的,但建议你使用它。 通过此库,可以更轻松地将身份验证添加到你的 Web 应用,因为它会提取大量 MSAL Python 详细信息。

  1. 在终端中,运行以下命令:

    python manage.py runserver localhost:5000                                             
    

    可以使用你任选的端口。 此端口应类似于你之前注册的重定向 URI 的端口。

  2. 打开浏览器,然后转到 http://localhost:5000。 应会看到类似于以下屏幕截图的页面:

    Django Web 应用示例登录页的屏幕截图。

  3. 在页面完成加载后,选择“登录”链接。 系统会提示你进行登录。

  4. 在登录页上,键入你的“电子邮件地址”,选择“下一步”,键入你的“密码”,然后选择“登录”。 如果没有帐户,请选择“无帐户? 创建一个”链接,以启动注册流。

  5. 如果选择注册选项,则将完成注册流程。 填写电子邮件、一次性密码、新密码和更多帐户详细信息,以完成整个注册流程。

  6. 登录或注册后,你会重定向回 Web 应用。 你将看到类似于以下屏幕截图的页面:

    成功身份验证后 flask Web 应用示例的屏幕截图。

  7. 选择“退出登录”以将用户从 Web 应用退出登录,或选择“调用下游 API”以调用 Microsoft Graph 终结点。

工作原理

当用户选择“登录”链接时,应用会发起身份验证请求,并将用户重定向到 Microsoft Entra 外部 ID。 然后,用户在显示的页面上登录或注册。 提供了所需的凭据并同意所需范围后,Microsoft Entra 外部 ID 会使用授权代码将用户重定向回 Web 应用。 然后,Web 应用会使用此授权代码从 Microsoft Entra 外部 ID 获取令牌。

当用户选择“退出登录”链接时,应用会清除其会话,将用户重定向到 Microsoft Entra 外部 ID 退出登录终结点,以通知它用户已退出登录。然后用户会重定向回 Web 应用。