如何将 ClientID 和 Authority 存储在托管在 Azure 和公共的 React 应用程序中?

How to store ClientID and Authority in an React Application that is hosted on Azure and public?

提问人:Berg 提问时间:10/6/2023 更新时间:10/9/2023 访问量:118

问:

我正在开发一个 React 应用程序,并且正在为 PublicClientApplication 配置 msalconfig.我是 Azure 和前端开发的新手。此外,我们是一个非常小的团队:(

我的问题: 硬编码 clientID 和权限:我阅读了多篇帖子,建议 clientID 和权限不是机密,可以直接存储在应用程序中。但是,我不愿对这些值进行硬编码,因为这似乎有风险。

Azure 应用服务配置:我还阅读了 Azure 应用服务在“配置”部分具有连接字符串/应用程序设置。但是,我不确定如何在 React 应用程序的代码中访问或使用这些设置,因为我是 Azure 新手。

我的第一个 Keyvault 注意事项:最初,我考虑通过 Azure Keyvault 检索 clientId 和颁发机构。但是,要访问 Keyvault,我需要提供机密,但我希望避免将任何此类机密存储在可能公开的客户端应用程序中。

问题: 对 clientID 和权限进行硬编码是一种安全的做法吗?有哪些安全隐患?

如何在 React 应用程序中从 Azure 应用服务访问连接字符串/应用程序设置?或者我什至应该使用它们?

使用的技术: 反应 维特 Azure 服务

后端只是 nodejs

import {Configuration, AccountInfo} from '@azure/msal-browser';

let MSAL_CONFIG: Configuration;

export const setupMSALConfig = async () => {
  MSAL_CONFIG = {
    auth: {
      clientId: import.meta.env.VITE_CLIENT_ID as string,
      authority: import.meta.env.VITE_AUTHORITY as string,
      redirectUri: '/',
    },
    cache: {
      cacheLocation: 'sessionStorage',
      storeAuthStateInCookie: true,
    },
    telemetry: {
      application: {
        appName: 'App',
        appVersion: '1.0.0',
      },
    },
  };
  return MSAL_CONFIG;
};

export type {AccountInfo};

export const loginRequest = {
  scopes: ['openid', 'profile', 'User.Read'],
};

我尝试对其进行硬编码/从密钥保管库获取信息。这有效,但有其缺点。

ReactJS 节点 .js Azure 安全性 azure-ad-msal

评论


答:

0赞 Harshitha 10/9/2023 #1

对 clientID 和权限进行硬编码是一种安全的做法吗?有哪些安全隐患?

对任何客户端密码进行硬编码都不是一种安全的方法,不建议这样做。

可用于存储客户端密钥的选项之一是使用 。Environment Variables

感谢@TechBrij的解释。

  • 我们可以使用后跟变量名称来访问环境变量中的值。process.env

如何从 Azure 应用服务访问连接字符串/应用程序设置How can I access Connection String/Application Settings from the Azure App Service

首先,我们需要在已部署的 React App 的 Environment Variable 部分设置 Key-Value 对。

enter image description here

  • 如上所述设置的变量可在“环境变量”部分 (KUDU) 中找到。

链接到 KUDU - DeployedAppName.scm.azurewebsites.net

enter image description here

  • 现在您可以访问 asClientID
const clientid = process.env.ClientID;
  • 但与环境变量相比,使用 Azure 是更安全、更好的机密存储方式。Key Vault

但是要访问 Keyvault,我需要提供一个机密,

我们只需要传递 KVName 和 Secret 名称。 无需在客户端应用程序中存储密钥值。

评论

0赞 Berg 10/11/2023
谢谢你的解释。但是,当我以“更安全”的方式将 ClientID 和 Tenant 存储在 Key Vault 中并使用 KVName 和 Secret Name 接收它们时。我仍然会遇到这样的问题,即当您查看应用程序的源时,当我从 Key Vault 接收它们时,这两个值都可以访问?因为这是一个 React 应用程序前端。这两个值都需要允许登录页的 MSAL。还是我想错了,他们无法访问?
0赞 Harshitha 10/11/2023
是的,所有能够在本地访问应用程序的人都可以访问这些机密。但是,若要访问 Azure 资源,用户必须已授予他们正在使用的帐户的权限。您可以使用 RBAC(基于角色的访问)
0赞 Berg 10/11/2023
但是,如何在没有的情况下访问客户端的 Azure 应用服务环境变量?1. 我如何隐藏和隐藏公共登录页面,因为您认为它们是敏感的?它们不会总是显示出来吗?2. SO 帖子说的是,不是秘密。你能澄清一下吗?3. 使用不安全的 API 端点来获取 和 是个好主意,但仍然可以从前端访问它们。process.envClientIDTenantIDClientIDTenantIDClientIDTenantID