身份验证如何在 Azure Functions 上工作
How does authentication work on Azure Functions
我有一个 .Net 5 Web API 托管在 Azure 应用服务上。
API 有三个后台服务 运行 作为托管服务,它们执行长时间的 运行 进程,例如群发电子邮件和短信,以及每天运行一次的其他功能在计时器上。
我正在考虑将这些 hosted/background 服务移出到单独的 Azure Functions 中,然后我将通过 HTTP 请求从我的 API 调用/触发这些服务(运行在定时器)
我担心的是身份验证。它如何与 Azure Functions 一起使用?目前,我的 Web API 正在使用 Auth0 作为身份验证服务器。因此,当用户使用 front-end 网络应用程序 (Angular) 时,他登录(通过 Auth0 的登录表单),然后 front-end 从 AUth0 检索一个 access/bearer 令牌,然后它包含在对 API 的每次调用中(在身份验证 header 中)。
现在,显然我不希望任何人都能够调用 Azure Functions - 只有我的 Web API 应该能够这样做。但它是如何工作的呢? API 是否需要在调用它时将它从前端收到的访问令牌转发给 Azure Function?还是我需要在 Azure 门户中设置一些东西来告诉它必须允许我的 API 访问 Azure 函数(并阻止来自任何其他来源的任何请求)?
我以前从未使用过 Azure Functions 甚至 WebJobs,所以我有点迷茫。
谢谢
对于此要求,您只需启用函数应用程序的“Authentication/Authorization”即可。
按照上面截图中的步骤,当你点击第四个红色框时,选择“Express”选项卡并点击“ok " 在页面底部不执行任何操作。它将在您的 Azure AD 中创建一个与您的函数应用同名的应用程序。
之后,当您在浏览器中请求功能应用url时,它会要求您登录。
更多详细步骤可以参考这篇document。
创建 HTTP-triggered Azure Functions 时,默认情况下将其设置为授权级别 = Function,这意味着任何试图通过其 URL 调用该函数的应用程序都需要知道具体的创建时为该函数生成的访问密钥。
在您的示例中,您的网站 API 将在其配置中存储该函数的调用 URL 和访问密钥,并使用该密钥调用您的函数。由于密钥完全 server-side 保留在 Azure 上,其他任何人都无法访问它,因此它是完全安全的。
根据您的要求,您还可以在访问密钥机制之上层叠其他类型的 authorization/authentication(例如不记名令牌),或者使用这些而不是访问密钥(通过设置允许的功能匿名访问)。
为了获得最大的安全性,我建议首先使用函数访问密钥来确保除您的应用程序之外没有人可以成功调用该函数,然后传递和验证不记名令牌以确保应用程序尝试确实允许调用该函数。
请注意,Azure Functions 与标准 ASP.NET Core 略有不同,特别是在它 doesn't really support yet 的中间件方面,因此您可能需要为它编写自己的代码从传入的 HTTP 请求中读取不记名令牌 headers,并验证它是否有效。
取决于您所说的身份验证是什么意思。
如果您只想保护您的功能,您可以使用授权级别 = 功能。
但是,如果您需要通过登录进行身份验证,并且需要知道发出请求的用户,则必须将承载令牌与 OpenIDConnect 服务器一起使用。
无论使用何种方法,始终使用无状态身份验证。
我有一个 .Net 5 Web API 托管在 Azure 应用服务上。
API 有三个后台服务 运行 作为托管服务,它们执行长时间的 运行 进程,例如群发电子邮件和短信,以及每天运行一次的其他功能在计时器上。
我正在考虑将这些 hosted/background 服务移出到单独的 Azure Functions 中,然后我将通过 HTTP 请求从我的 API 调用/触发这些服务(运行在定时器)
我担心的是身份验证。它如何与 Azure Functions 一起使用?目前,我的 Web API 正在使用 Auth0 作为身份验证服务器。因此,当用户使用 front-end 网络应用程序 (Angular) 时,他登录(通过 Auth0 的登录表单),然后 front-end 从 AUth0 检索一个 access/bearer 令牌,然后它包含在对 API 的每次调用中(在身份验证 header 中)。
现在,显然我不希望任何人都能够调用 Azure Functions - 只有我的 Web API 应该能够这样做。但它是如何工作的呢? API 是否需要在调用它时将它从前端收到的访问令牌转发给 Azure Function?还是我需要在 Azure 门户中设置一些东西来告诉它必须允许我的 API 访问 Azure 函数(并阻止来自任何其他来源的任何请求)?
我以前从未使用过 Azure Functions 甚至 WebJobs,所以我有点迷茫。 谢谢
对于此要求,您只需启用函数应用程序的“Authentication/Authorization”即可。
按照上面截图中的步骤,当你点击第四个红色框时,选择“Express”选项卡并点击“ok " 在页面底部不执行任何操作。它将在您的 Azure AD 中创建一个与您的函数应用同名的应用程序。
之后,当您在浏览器中请求功能应用url时,它会要求您登录。
更多详细步骤可以参考这篇document。
创建 HTTP-triggered Azure Functions 时,默认情况下将其设置为授权级别 = Function,这意味着任何试图通过其 URL 调用该函数的应用程序都需要知道具体的创建时为该函数生成的访问密钥。
在您的示例中,您的网站 API 将在其配置中存储该函数的调用 URL 和访问密钥,并使用该密钥调用您的函数。由于密钥完全 server-side 保留在 Azure 上,其他任何人都无法访问它,因此它是完全安全的。
根据您的要求,您还可以在访问密钥机制之上层叠其他类型的 authorization/authentication(例如不记名令牌),或者使用这些而不是访问密钥(通过设置允许的功能匿名访问)。
为了获得最大的安全性,我建议首先使用函数访问密钥来确保除您的应用程序之外没有人可以成功调用该函数,然后传递和验证不记名令牌以确保应用程序尝试确实允许调用该函数。
请注意,Azure Functions 与标准 ASP.NET Core 略有不同,特别是在它 doesn't really support yet 的中间件方面,因此您可能需要为它编写自己的代码从传入的 HTTP 请求中读取不记名令牌 headers,并验证它是否有效。
取决于您所说的身份验证是什么意思。 如果您只想保护您的功能,您可以使用授权级别 = 功能。 但是,如果您需要通过登录进行身份验证,并且需要知道发出请求的用户,则必须将承载令牌与 OpenIDConnect 服务器一起使用。 无论使用何种方法,始终使用无状态身份验证。