我有一个托管在 Azure 应用服务上的 .Net 5 Web API。
该 API 具有三个作为托管服务运行的后台服务,这些服务执行长时间运行的进程,例如批量发送电子邮件和短信,以及每天在计时器上运行一次的其他功能。
我正在考虑将这些托管/后台服务移出到单独的 Azure Functions 中,然后我将通过 HTTP 请求从我的 API 调用/触发这些服务(在计时器上运行的服务除外)
我担心的是身份验证。它如何与 Azure Functions 配合使用?目前,我的 Web API 使用 Auth0 作为身份验证服务器。因此,当用户使用前端 Web 应用程序 (Angular) 时,他会登录(通过 Auth0 的登录表单),然后前端从 AUth0 检索访问/不记名 token ,然后将其包含在对 API 的每次调用中(在身份验证 header 中)。
现在,显然我不希望任何人都能够调用 Azure Functions - 只有我的 Web API 应该能够这样做。但这是如何运作的呢? API在调用时是否需要将从前端收到的访问 token 转发到Azure Function?或者我是否需要在 Azure 门户中设置一些内容来告诉它必须允许我的 API 访问 Azure 功能(并阻止来自任何其他来源的任何请求)?
我以前从未使用过 Azure Functions 甚至 WebJobs,所以我有点迷失。 谢谢
最佳答案
创建 HTTP 触发的 Azure Function 时,默认情况下将其设置为授权级别 = Function,这意味着任何尝试通过其 URL 调用该函数的应用程序都需要知道为该函数生成的特定访问 key 创建时。
在您的示例中,您的 Web API 会在其配置中存储该函数的调用 URL 和访问 key ,并使用该 key 调用您的函数。由于 key 完全保留在 Azure 的服务器端,任何其他东西都无法访问它,因此它是完全安全的。
根据您的要求,您还可以在访问 key 机制之上分层其他类型的授权/身份验证(例如不记名 token ),或者使用这些而不是访问 key (通过设置允许匿名访问的功能)。
为了获得最大的安全性,我建议首先使用函数访问 key ,以确保除了您的应用程序之外没有人可以成功调用该函数,然后传递并验证不记名 token 以确保应用程序尝试调用该函数确实被允许这样做。
请注意,Azure Functions 与标准 ASP.NET Core 略有不同,特别是在它 doesn't really support yet 的中间件方面。 ,因此您可能需要编写自己的代码来从传入 HTTP 请求的 header 中读取不记名 token ,并验证其是否有效。
关于azure - Azure Functions 上的身份验证如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66042273/