【问题标题】:How to authenticate to an Azure Function using function auth or Azure AD service principal如何使用函数身份验证或 Azure AD 服务主体对 Azure 函数进行身份验证
【发布时间】:2019-08-21 08:04:02
【问题描述】:

我有一个 Azure 函数,用于从 Azure AD 获取数据,但我想限制谁可以使用该函数,因为它将使用 HTTP 触发器,以便我能够从逻辑应用程序稍后。 因此,由于 HTTP 触发的 Azure Functions 具有公共终结点,我想通过将授权级别设置为 Function 来提高安全性,或者更可取的是使用 Azure AD 服务主体(预先创建)。 进行此更改后,我可以通过将函数放入 URL 来进行调用。

基本网址: https://something.com/api/function_name

带有令牌的网址: https://something.com/api/function_name?code=token_here

但是,我的函数需要给出一些输入。 在匿名端点上,您可以像这样扩展基本 URL: https://something.com/api/function_name/?parameter=value

其中参数是代码所期望的,以及在代码中传递给变量的值。 现在我是这个 HTTP 端点的新手,并通过 URL 传递值。我知道这是作为 JSON 传递的(可能)

但我不明白如何同时进行功能授权和传入参数。 我试过了:

https://something.com/api/function_name/?parameter=value?code=token_here
https://something.com/api/function_name?code=token_here/?parameter=value

有人知道这应该如何工作吗?

另一方面,我还可以将 Platform Features -> Authentication / Authorization 设置为 Azure AD 服务主体。但是,如何更改 URL 以使用该服务主体的 client_idclient_secret 进行身份验证? 我实际上更喜欢使用这种方法,因为这样我可以对令牌实施生命周期管理并对其进行轮换以使其更加安全。

我看过这里: Azure function with Azure AD authentication access using JavaScript

而我在 stackoverflow 上找到的大多数其他主题甚至都没有接近。

PS:这个 PS 不需要答案,但我会很感激任何想法。 我正在制作的这个东西是一个结合了(预定)逻辑应用程序的工作流,它触发了Get-FunctionGet-Function 需要以某种方式触发Update-Function。我正在触发Get-Function HTTP,以便我还能够将其作为 API 提供,以使该功能可用于自动化。 (允许在不需要 Azure AD 权限的人的情况下通过 API 调用轮换机密) 然后,更新功能需要轮换(特定)应用程序/服务主体上的机密。 Azure Function 基于 v2 并使用 Powershell Core 作为语言。

【问题讨论】:

  • 好吧,我找到了对我的函数 auth 误解的答案:docs.microsoft.com/en-us/azure/azure-functions/… 对于需要传递到代码中的每个新查询,这只是一个简单的 &parameter=value&parameter=value。剩下的是 azure 广告服务主体身份验证
  • 嗨,Marco,那么您想了解如何使用 Azure AD 通过 Platform Features -> Authentication / Authorization 方式来保护您的函数应用程序,对吗?只有通过 Azure 广告身份验证的请求才能调用您的函数应用?
  • 嗨,斯坦,最好是。我已经知道如何配置这些设置。就在调用 URL 时,它似乎要求提供我的用户凭据。所以基本上只是想知道我应该如何使用 clientid 和 secret 进行身份验证。

标签: powershell authentication azure-functions powershell-core service-principal


【解决方案1】:

如果你想使用Platform Features -> Authentication / Authorization (Easy Auth) 来保护你的匿名http触发函数,你可以按照以下步骤:

  1. 启用身份验证/授权(简易身份验证),使用 Azure AD 快速模式:

点击保存。完成此过程后,请记下您的功能广告应用的 client_id,我们稍后将使用它。

  1. 创建 Azure AD 应用程序

为其创建一个客户端密码,记下客户端密码值和新的 Azure AD 应用 ID:

  1. 发出请求以从您的 Azure AD 获取访问令牌,以便我们可以调用您的 http 触发函数:
Request URL:
POST https://login.microsoftonline.com/<-your tenant id/name->/oauth2/token

Request Header:
Content-Type: application/x-www-form-urlencoded

Request Body:
grant_type=client_credentials
&resource=<-function App ID->
&client_id=<-new Azure AD App ID->
&client_secret=<-client secret of new Azure AD App ID->

如下:

正如您在响应中看到的那样,您可以获得访问令牌,因此在 http 请求标头 Authorization 参数中使用此令牌来调用启用了简易身份验证的 http 触发函数,所有没有正确授权标头的请求都将被阻止:

如果对你有帮助,请标记我。

【讨论】:

  • 嘿 Stan,这至少会部分让我到达那里。我已经完成了第 1 步和第 2 步。 3 让我走得更远 :) 该请求 URL 是我正在寻找的。你是在哪里拿到的?另外,我将如何在邮递员之外执行此令牌请求?这都是手动测试,我一定会看的。所以谢谢你!您是否也会碰巧知道我将如何以编程方式执行此操作?我假设它基本上是 URL 的某种格式?请注意,这都是用 powershell 编写的。也许像这样?:twilio.com/docs/usage/tutorials/…
  • 嗨 @Marco,这是一个 OAuth 2.0 服务,用于服务 Azure AD 的调用身份验证流程,这是关于它的官方文档:docs.microsoft.com/en-us/azure/active-directory/develop/…,如果您有任何不清楚的地方,请随时让我知道:)
  • 谢谢!你让我领先很多,我想我能够以某种方式弄清楚程序访问部分。 :)
  • 欢迎您!希望你有一个愉快的一天!
  • 这很好,但我最终得到了 401。我不清楚具有为应用程序testAuth 获取的令牌的客户端如何访问由应用程序 stanfuntest001 保护的资源。我看不出这两者之间有任何关系,我相信这是 401 错误的原因。你错过了什么吗?还是我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多