【问题标题】:Unauthorized when requesting a token from Azure App Service从 Azure 应用服务请求令牌时未经授权
【发布时间】:2022-01-03 21:26:50
【问题描述】:

我正在创建一个需要调用 Azure 函数的简单 Web 应用。

我在 Azure AD 中注册了 2 个应用程序:一个用于我的单页响应应用程序,另一个用于我的 Azure Function。

我的 azure 函数的应用程序有一个公开的 API,并配置了一个名为 CallApi 的范围。

应用本身已配置身份验证(简单身份验证),并且客户端 ID 与 AAD 中的 API 应用注册匹配:

我的 SPA 应用有权请求此范围,并且默认情况下为所有用户授予此权限。

我能够成功地将用户登录到我的 SPA 并获得访问令牌。我正在使用 @azure/msal-browser@azure/msal-react npm 库来执行此操作,具体来说:

<MsalAuthenticationTemplate interactionType={InteractionType.Redirect} authenticationRequest={{scopes: ["User.Read", "api://<redacted>/CallApi"]}} >

但是,返回的访问令牌仅具有以下范围:['openid', 'profile', 'User.Read', 'email'] 而不是 api://&lt;redacted&gt;/CallApi。因此,当我尝试通过向https://&lt;app_name&gt;.azurewebsites.net/.auth/login/aad 发送 POST 请求来将访问令牌换成令牌时,它会返回一条未经授权的消息。

如何确保我的应用允许 CallApi 范围?

【问题讨论】:

    标签: javascript azure authentication msal


    【解决方案1】:

    因此,当我尝试通过向https://&lt;app_name&gt;.azurewebsites.net/.auth/login/aad 发送 POST 请求来将访问令牌换成令牌时,它会返回未经授权的消息。

    请确保 URL 正确,其格式应为 &lt;app-url&gt;/.auth/login/aad/callback,并注意参数位于 HTTP POST 请求的正文中。

    但是,返回的访问令牌仅具有以下范围:['openid', 'profile', 'User.Read', 'email']

    openid

    如果应用使用 OpenID Connect 执行登录,则它必须请求 openid 范围。也就是说openid范围在工作账号同意页面上显示为“登录”权限。

    电子邮件

    电子邮件范围可以与 openid 范围一起使用。因为它以电子邮件声明的形式让应用程序访问用户的主要电子邮件地址。其中,仅当电子邮件地址与用户帐户相关联时,电子邮件声明才会包含在令牌中,但情况并非总是如此。

    个人资料

    profile 范围也可以与 openid 范围一起使用。这使应用程序可以访问有关用户的大量信息。它可以访问的信息包括用户的名字、姓氏、首选用户名和对象 ID。

    在 Microsoft 生态系统中,有一些可以设置为管理员限制的高权限权限。这包括:

    • 首先,使用User.Read.All读取所有用户的完整资料
    • 其次,使用Directory.ReadWrite.All将数据写入组织的目录
    • 最后,使用 Groups.Read.All 读取组织目录中的所有组

    有关调用 API 范围的 POST 请求的示例,请参阅此 article

    【讨论】:

    • 您好@smythluke,如果回答对您有帮助,请Accept it as an Answer,以便其他遇到相同问题的人可以找到此解决方案并解决他们的问题。
    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 2017-10-16
    • 2017-07-06
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多