在 Microsoft Entra ID 中更新应用所需权限

使用 Microsoft Entra ID 设置应用程序时,开发人员可以使用权限请求从其他应用和服务访问数据。 他们可以通过在应用部件清单中添加静态权限或在运行时动态请求权限来请求权限。 然后,用户或管理员可以选择在同意期间授予权限,从而允许应用访问所需的数据。

随着应用程序功能的发展,它需要访问的资源也会更改。 这些更改可能涉及启用新功能、消除不必要的访问,或者将高特权权限替换为较低特权权限。 本文介绍如何使用 Microsoft Entra 管理中心和 Microsoft Graph API 调用更新应用程序请求的权限。

更新应用的权限不仅是一种安全性最佳做法,也是可以增强应用用户体验和采用的方法。 以下部分概述了更新应用权限的一些好处:

  • 如果你的应用具有新功能,则可以请求更多权限,使应用能够访问它所需的额外资源。
  • 如果你的应用程序仅请求运行所需的最低特权权限,那么客户更有可能采用它。 它显示你的应用尊重客户的隐私和数据保护,并且不会访问超出其所需的更多资源。
  • 此外,如果应用遭到入侵,则如果其具有较少的或较低的特权权限,则爆炸半径会更小。 这意味着攻击者对客户的数据和资源的访问权限较少,因此潜在损害会降低。
  • 通过更新应用的权限,可以改进应用的安全性、可用性和合规性,并与客户建立信任。

先决条件

若要更新应用所需权限,需要:

  • 一个 Microsoft Entra 用户帐户。 如果没有帐户,可免费创建一个帐户
  • 以下角色之一:应用程序管理员、云应用程序管理员。 不是管理员的应用程序所有者能够更新应用所需权限。

更新权限的场景

以下部分列出了需要更新应用程序请求的权限的三个主要场景:

  • 向应用程序添加权限
  • 从应用程序中移除未使用的权限
  • 替换权限

注意

更新应用程序所需权限不会自动授予或撤销应用对受保护资源的访问权限。 你的客户或组织中的管理员需要同意添加的新权限,或自行手动撤销权限。

向应用程序添加权限

如果你的应用具有需要以前不需要的权限的新功能,则可以添加权限。

最佳做法是仅请求访问应用所需的最低权限。 如果需要添加新的权限以支持应用中的新功能,请仅位该功能请求最低特权权限。 例如,若要向应用程序添加电子邮件通知功能,需要访问用户的电子邮件。 为此,需要请求对 Mail.ReadWrite 权限的访问权限。

静态同意是在应用程序注册时(而不是在运行时)请求用户或管理员的权限的一种方式。 静态同意要求应用在 Microsoft Entra 管理中心的“应用注册”窗格中声明它所需的所有权限。 使用 Microsoft Entra 管理中心,只能更新静态同意的权限。 若要详细了解不同类型的同意,请参阅同意类型。 若要了解如何更新动态同意的权限,请参阅本文的 Microsoft Graph 选项卡。

本部分介绍如何将权限添加到静态同意中。

可以在 Microsoft Entra 管理中心以两种不同的方式向静态同意添加权限:

选项 1:在 API 权限窗格中添加权限

  1. 以至少为云应用程序管理员的身份或应用程序所有者的身份登录到 Microsoft Entra 管理中心
  2. 浏览到“标识”>“应用程序”>“应用注册”>“所有应用程序”。
  3. 找到要向其添加权限的应用注册并将其选中。 可以通过两种不同的方式添加权限:
  4. API 权限窗格中添加权限。
    1. 找到“API 权限”窗格,然后选择“添加权限”。

    2. 选择要访问的 API 以及要从可用选项列表中请求的权限,然后选择“添加权限”。

      API 权限面板的屏幕截图。

选项 2:向应用程序清单添加权限

  1. 在左侧导航窗格中,在“管理”菜单组下,选择“清单”。 该选择将打开一个编辑器,用于直接编辑应用注册对象的属性。
  2. 仔细编辑应用程序清单文件中的 requiredResourceAccess 属性。
  3. 添加 resourceAppId 属性和 resourceAccess 属性并分配所需的权限。
  4. 保存所做更改。

若要完成添加权限的以下步骤,需要以下资源和权限:

  • 在你选择的工具中运行 HTTP 请求,例如,在你的应用中或通过 Graph 浏览器。
  • 以至少为云应用程序管理员的用户或目标应用注册的所有者身份运行 API。
  • 必须向用于进行这些更改的应用授予 Application.ReadWrite.All 权限。
  1. 确定应用所需的权限、其权限 ID 以及应用角色(应用程序权限)或是委派权限。 例如,如果要请求 Microsoft Graph 权限,请参阅 Microsoft Graph 权限,获取权限列表及其 ID。

  2. 将所需的 Microsoft Graph 权限添加到应用。 以下示例调用更新应用程序 API,将所需的 Microsoft Graph 权限添加到由对象 ID aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb 标识的应用注册。 此示例使用 Analytics.ReadApplication.Read.All 委托的权限和应用程序权限。 Microsoft Graph 被标识为 ServicePrincipal 对象,其中 00000003-0000-0000-c000-000000000000 为其全局唯一 AppId

    PATCH https://graph.microsoft.com/v1.0/applications/aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
    Content-Type: application/json
     {
         "requiredResourceAccess": [
             {
                 "resourceAppId": "00000003-0000-0000-c000-000000000000",
                 "resourceAccess": [
                     {
                         "id": "e03cf23f-8056-446a-8994-7d93dfc8b50e",
                         "type": "Scope"
                     },
                     {
                         "id": "9a5d68dd-52b0-4cc2-bd40-abcf44ac3a30",
                         "type": "Role"
                     }
                 ]
             }
         ]
     }
    

动态同意是在运行时从用户或管理员请求权限的一种方式,而不是在“应用注册”窗格中静态声明权限。 动态同意允许应用仅请求特定功能所需的权限,并在需要时获取用户或管理员的同意。 动态同意可以与委托的权限一起使用,并且可以与 /.default 范围结合使用,以请求管理员同意所有权限。

若要将权限添加到动态同意中,请执行以下操作:

  • 使用 Microsoft Graph:将所需的 Microsoft Graph 权限添加到应用注册。 此示例使用 Analytics.ReadApplication.Read.All 委托的权限和应用程序权限。 将`scopes`中的值替换为要为应用配置的任何 Microsoft Graph 委托的权限的值。

    请求应类似于以下示例:

    https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=00001111-aaaa-2222-bbbb-3333cccc4444&response_type=code&scope=Analytics.Read+Application.Read

  • 使用 MSAL.js:将`scopes`中的值替换为要为应用配置的任何 Microsoft Graph 委托的权限的值。

      const Request = {
          scopes: ["openid", "profile"],
          loginHint: "example@domain.net"
      };
    
      myMSALObj.ssoSilent(Request)
          .then((response) => {
              // your logic
          }).catch(error => {
              console.error("Silent Error: " + error);
              if (error instanceof msal.InteractionRequiredAuthError) {
                  myMSALObj.loginRedirect(loginRequest);
              }
      });
    

将权限添加到应用程序后,用户或管理员需要授予对新权限的同意。 非管理员用户在登录应用时会看到同意提示。 另一方面,管理员用户可以在首次登录到应用或 Microsoft Entra 管理中心时代表组织中的所有用户授予对新权限的同意。

当添加的权限需要管理员同意时,所需的操作因应用类型而异:

  • 主租户中的单租户应用和多租户应用:用户必须至少以特权角色管理员角色登录并授予租户范围的同意
  • 客户租户中的多租户应用:用户在下次登录尝试时会看到新的同意提示。 如果权限只需要用户同意,则用户可以授予同意。 如果权限需要管理员同意,用户必须联系其管理员才能授予同意。

停止请求未使用的权限

移除权限可降低公开敏感数据或损害安全性的风险,并简化用户或管理员的同意过程。 如果应用不再需要权限,则应通过从应用注册所需的资源访问和代码中移除权限来阻止应用请求该权限。 例如,不再发送电子邮件通知的应用程序可以移除 Mail.ReadWrite 权限。

重要

从应用注册中移除权限不会自动撤销已授予应用的权限。 需要手动撤销权限。 有关详细信息,请参阅本文中撤销对企业应用程序已移除权限的同意部分。

若要停止请求需要静态同意的权限,需要从应用注册窗格中移除该权限。 租户的管理员还需要在“企业应用程序”窗格上撤销权限。 有关如何撤销授予企业应用程序的权限的详细信息,请参阅撤销企业应用程序的权限

本部分介绍如何停止请求静态同意的权限。

可以在 Microsoft Entra 管理中心以两种不同的方式从静态同意中删除权限:

选项 1:从“API 权限”窗格

  1. 以至少为云应用程序管理员的身份或应用程序所有者的身份登录到 Microsoft Entra 管理中心
  2. 浏览到“标识”>“应用程序”>“应用注册”>“所有应用程序”。
  3. 查找要从中移除权限的应用注册,并将其选中。
  4. 从“API 权限”窗格中移除权限:
    1. 找到“API 权限”窗格,找到要移除的权限。

    2. 选择要移除的 API,然后选择首先“撤销管理员同意”,然后移除权限。 它可确保从租户中移除已授予的权限。

      屏幕截图显示如何通过 API 权限窗格删除权限。

选项 2:从应用程序清单

  1. 在左侧导航窗格中,在“管理”菜单组下,选择“清单”。 此时会打开一个编辑器,用于直接编辑应用注册对象的属性。
  2. 仔细编辑应用程序清单文件中的 requiredResourceAccess 属性。
  3. resourceAppId 属性和 resourceAccess 属性中移除不需要的权限。
  4. 保存所做的更改。

若要完成以下移除权限的步骤,需要以下资源和权限:

  • 在你选择的工具中运行 HTTP 请求,例如,在你的应用中或通过 Graph 浏览器。
  • 以至少为云应用程序管理员的身份或目标应用注册的所有者身份调用 API。
  • 必须向用于进行这些更改的应用授予 Application.ReadWrite.All 权限。
  1. 确定应用的权限。

  2. 例如,若要阻止应用请求 Microsoft Graph 权限,请标识应用的 Microsoft Graph 权限、其权限 ID 以及它们是应用角色(应用程序权限)还是委托的权限。

  3. 从应用中移除不需要的 Microsoft Graph 权限。 以下示例调用更新应用程序 API,从由样本客户端 ID 00001111-aaaa-2222-bbbb-3333cccc4444 标识的应用注册中移除不需要的 Microsoft Graph 权限。 在此示例中,应用程序具有 Analytics.ReadUser.ReadApplication.Read.All。 我们需要删除 Analytics.ReadApplication.Read.All 委托的权限和应用程序权限。 Microsoft Graph 被标识为 ServicePrincipal 对象,00000003-0000-0000-c000-000000000000 作为其全局唯一 AppId,Microsoft Graph 作为其 DisplayNameAppDisplayName

    PATCH https://graph.microsoft.com/v1.0/applications/00001111-aaaa-2222-bbbb-3333cccc4444
    Content-Type: application/json
    {
        "requiredResourceAccess": [
            {
                "resourceAppId": "00000003-0000-0000-c000-000000000000",
                "resourceAccess": [
                    {
                        "id": "311a71cc-e848-46a1-bdf8-97ff7156d8e6 ",
                        "type": "Scope"
                    }
                ]
            }
        ]
    }
    

如果需要从动态同意请求中删除委派权限,请在退出要删除的权限时指定范围参数。 移除权限可确保应用不会调用相应的 API。

此方法仅适用于委托的权限。 应用程序权限由管理员通过静态同意请求和授予,在 OAuth 2.0 授权请求期间不包括在范围参数中。

若要停止使用动态同意请求权限,请执行以下操作:

  • 使用 Microsoft Graph:从`scopes`参数中移除不需要的 Microsoft Graph 委派权限。 在此示例中,应用程序会请求三个权限,Analytics.ReadUser.ReadApplication.Read。 此应用不再需要委托的权限 Analytics.Read 和应用程序权限 Application.Read。 它只需要 User.Read

请求应类似于以下示例:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=00001111-aaaa-2222-bbbb-3333cccc4444&response_type=code&scope=User.Read

  • 使用 MSAL.js:删除`scopes`中不需要的 Microsoft Graph 委托的权限。

        const Request = {
            scopes: ["openid", "profile"],
            loginHint: "example@domain.net"
        };
    
        myMSALObj.ssoSilent(Request)
            .then((response) => {
                // your logic
            }).catch(error => {
                console.error("Silent Error: " + error);
                if (error instanceof msal.InteractionRequiredAuthError) {
                    myMSALObj.loginRedirect(loginRequest);
                }
        });
    

从应用注册中移除权限后,租户中的管理员还需要撤销同意来保护组织的数据。 当已移除的权限需要管理员同意时,所需的操作因应用类型而异:

  • 主租户中的单租户应用和多租户应用:对于单个租户应用,请联系租户的管理员以撤销已授予应用的权限。 对于多租户应用,请联系应用程序实例所在的所有租户的管理员,以撤销授予企业应用程序的权限。 撤消对已移除权限的同意可确保应用程序不会通过已移除的权限保持访问权限。
  • 客户租户中的多租户应用:确保通过公告、博客和任何其他沟通渠道与客户进行沟通,以撤销权限。

对于单租户和多租户应用,启用用户同意的租户中的非管理员用户可以使用 MyApps 门户撤销他们对以前授予的权限的同意。 有关如何在 MyApps 门户中撤消权限的详细信息,请参阅撤销最终用户同意

替换权限

当较低特权权限足够时,应使用其将高特权权限替换掉。

替换权限还可以降低公开敏感数据或破坏安全性的风险,从而改善用户体验和信任。 如果应用使用高特权权限(如 Directory.ReadWrite.All),则应考虑使用较低特权权限(如 User.ReadWrite.All)是否足以满足应用功能。

注意

修改应用对于静态同意的所需权限时,客户需要重新同意。 重新同意的行为将撤销先前授予的所有权限,并同意新权限。 修改应用对于动态同意的所需权限时,不会撤销以前授予的权限。 客户必须手动撤销权限。

若要替换权限,需要移除不必要的权限并添加替代权限。 这些步骤类似于本文“停止请求未使用的权限”和添加权限部分中所述的步骤。