Azure函数上的身份验证是如何工作的

Azure函数上的身份验证是如何工作的,azure,asp.net-core,authentication,azure-functions,webapi,Azure,Asp.net Core,Authentication,Azure Functions,Webapi,我有一个托管在Azure应用程序服务上的.Net 5 Web API API有三个后台服务作为托管服务运行,它们执行长时间运行的过程,如批量发送电子邮件和短信,以及其他每天在计时器上运行一次的功能 我正在考虑将这些托管/后台服务迁移到单独的Azure函数中,然后通过HTTP请求从我的API调用/触发这些函数(在计时器上运行的函数除外) 我关心的是身份验证。这在Azure函数中是如何工作的?目前,我的Web API使用Auth0作为身份验证服务器。因此,当用户使用前端web应用程序(Angular

我有一个托管在Azure应用程序服务上的.Net 5 Web API

API有三个后台服务作为托管服务运行,它们执行长时间运行的过程,如批量发送电子邮件和短信,以及其他每天在计时器上运行一次的功能

我正在考虑将这些托管/后台服务迁移到单独的Azure函数中,然后通过HTTP请求从我的API调用/触发这些函数(在计时器上运行的函数除外)

我关心的是身份验证。这在Azure函数中是如何工作的?目前,我的Web API使用Auth0作为身份验证服务器。因此,当用户使用前端web应用程序(Angular)时,他登录(通过Auth0的登录表单),然后前端从Auth0检索访问/承载令牌,该令牌随后包含在对API的每次调用中(在身份验证标头中)

现在,显然我不希望任何人都能调用Azure函数——只有我的Web API才能这样做。但这是怎么回事?在调用Azure函数时,API是否需要将从前端接收到的访问令牌转发给Azure函数?或者我需要在Azure Portal中设置一些东西来告诉它必须允许我的API访问Azure功能(并阻止来自任何其他来源的任何请求)

我以前从未使用过Azure函数甚至WebJobs,所以我有点迷路了。
感谢您满足此要求,您只需启用功能应用程序的“身份验证/授权”

按照上面屏幕截图中的步骤进行操作,当您单击第四个红色框时,选择“Express”选项卡,然后单击页面底部的“ok”而不执行任何操作。它将在你的Azure广告中创建一个与你的功能应用程序同名的应用程序。

之后,当您在浏览器中请求功能应用程序url时,它将要求您登录


有关这些步骤的更多详细信息,您可以参考。

在创建HTTP触发的Azure函数时,默认情况下,它被设置为具有授权级别=函数,这意味着任何试图通过其URL调用该函数的应用程序都需要知道在创建该函数时为该函数生成的特定访问密钥

在您的示例中,您的web API将在其配置中存储该函数的调用URL和访问键,并使用该键调用您的函数。由于密钥在Azure上完全保留在服务器端,其他任何东西都无法访问它,因此它是完全安全的

根据您的要求,您还可以在访问密钥机制之上分层其他类型的授权/身份验证(例如,承载令牌),或者使用这些类型的授权/身份验证而不是访问密钥(通过将函数设置为允许匿名访问)

为了获得最大的安全性,我建议首先使用函数访问密钥,以确保除您的应用程序外,没有人可以成功调用该函数,然后传递并验证承载令牌,以确保尝试调用该函数的应用程序确实被允许这样做

请注意,Azure函数与标准ASP.NET核心稍有不同,特别是在使用它的中间件方面,因此您可能需要使用自己的代码从传入HTTP请求的头读取承载令牌,并验证其有效性


参考资料:

取决于您所指的身份验证。 如果您只想保护您的功能,可以使用authorization level=功能。 但是,如果您需要通过登录进行身份验证,并且需要知道发出请求的用户,则必须使用OpenIDConnect服务器的承载令牌。
无论使用何种方法,始终使用无状态身份验证。

谢谢你,伊恩,我会试试的。我认为,至少就目前而言,默认的访问密钥授权级别将非常有效。正如您所说,Web API和函数都托管在Azure应用程序服务上,因此在配置文件中存储访问密钥可能是可以的。