代码之家  ›  专栏  ›  技术社区  ›  ChrisEenberg

如何通过Azure Active Directory将Angular Web应用程序与Azure功能应用程序链接?

  •  2
  • ChrisEenberg  · 技术社区  · 6 年前

    我目前正在一个项目中工作,在这个项目中,我必须通过Angular7客户机应用程序从一个Azure函数应用程序端点提取数据。此终结点受Azure Active Directory保护,并且已通过应用程序注册(预览)UI进行设置。

    这很好地工作,因为我现在似乎无法访问这些端点。我尝试过通过邮递员和通过函数app部分下的get url生成的代码来传递令牌。它完全锁定了。我每次都是未经授权的。

    我遵循的步骤

    我已经按照描述设置了我的角度客户 here 在MSAL库的文档中。我已经用过了 v2 endpoint 设置我的客户端应用程序连接。然后,我通过应用程序注册(预览)连接了我的函数应用程序端点。我已经设置了权限,并使用其客户端ID对我的webapp进行了预授权-添加了重定向URL到 http://localhost:4200 -将MSAL模块添加到Angular,如下所示:

      MsalModule.forRoot({
          clientID: 'my-client-id',
          redirectUri: 'http://localhost:4200',
          consentScopes: [
            'user.read',
            'https://myapp.azurewebsites.net/user_impersonation'
          ]
        }),
    

    我尝试过通过Azure用户界面进行各种可能的安全设置组合,虽然我对Azure还很陌生(已经使用了一周),但我几乎可以说我已经无处不在,不再靠近了。

    每次查询端点时,我都会得到一个 401 Unauthorized 带着信息:

    您没有查看此目录或页面的权限。

    我应该补充一下,我在本地运行我的Angular网站。

    我不会被重定向到授权页面,即使我已经将其设置为在Azure UI中的情况-在Azure Active Directory保护下。

    我试过几个导游,包括 this 从步骤上很好地了解我所做的工作。

    我没什么主意了,你们中有人对此有过麻烦吗?

    编辑

    与授权有关的服务器代码:

    public static async Task<HttpResponseMessage> RunGraphQLService([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, ILogger log)
    

    正如评论中所提到的,我将请求发送到服务部门,非常好, Authorization: Bearer ey......something 很好,但API调用仍然被拒绝。

    邮差的屏幕截图,减去敏感信息: Postman screenshot

    这是我所能想到的。关于更多信息。

    亲切问候 克里斯

    1 回复  |  直到 6 年前
        1
  •  2
  •   Mavi Domates    6 年前

    啊哈!您的功能正在使用 AuthorizationLevel.Function -哪一个 this 文档在调用时应该传递一个特定生成的函数键。

    从文章中:

    可以将密钥作为 代码查询字符串。或者,它可以包括在 x-functions-key HTTP头。只有键值,而不是其名称是 通过。

    功能授权级别需要密钥进行授权。两个 功能和主机键将工作。在这个意义上,它是少 限制基于密钥的授权级别。

    所以-让你的同事生成这把钥匙/或者把生成的钥匙给你-然后你通过你的角度应用程序 x-functions-key 头/或按说明在查询字符串中传递它:)

    编辑更新

    这个问题被证实与 授权级别.函数 代码的一部分。我不能用Azure函数模板(使用2.0运行时)重新设置这种行为-我用经典的样板文件模板创建了一个函数 Run 为请求服务的函数,它为我工作。在聊天部分,克里斯提到,为了缓解这个问题 授权级别.函数 保护现在被禁用-等待进一步检查。

    只是另一个FYI-Azure并不建议使用功能键进行生产保护——这些键可以从前端请求中嗅出。

    Functions Documentation:

    虽然密钥可能有助于在开发过程中混淆HTTP端点, 它们不是用来保护HTTP触发器的 生产。要了解更多信息,请参见 Secure an HTTP endpoint in production.

    推荐文章