身份验证如何在 Azure Functions 上工作
Posted
技术标签:
【中文标题】身份验证如何在 Azure Functions 上工作【英文标题】:How does authentication work on Azure Functions 【发布时间】:2021-05-08 13:20:00 【问题描述】:我有一个托管在 Azure 应用服务上的 .Net 5 Web API。
该 API 具有三个作为托管服务运行的后台服务,它们执行长时间运行的流程,例如批量发送电子邮件和短信,以及每天按计时器运行一次的其他功能。
我正在考虑将这些托管/后台服务转移到单独的 Azure Functions 中,然后我将通过 HTTP 请求从我的 API 调用/触发(除了在计时器上运行的那个)
我担心的是身份验证。这如何与 Azure Functions 一起使用?目前,我的 Web API 使用 Auth0 作为身份验证服务器。因此,当用户使用前端 Web 应用程序 (Angular) 时,他登录(通过 Auth0 的登录表单),然后前端从 AUth0 检索访问/承载令牌,然后它包含在对 API 的每次调用中(在 Authentication 标头中)。
现在,显然我不希望任何人都能调用 Azure Functions - 只有我的 Web API 才能这样做。但这是如何工作的? API调用时是否需要将从前端收到的访问令牌转发给Azure Function?或者我需要在 Azure 门户中设置什么来告诉它必须允许我的 API 访问 Azure 函数(并阻止来自任何其他来源的任何请求)?
我以前从未使用过 Azure Functions 甚至 WebJobs,所以我有点迷茫。 谢谢
【问题讨论】:
【参考方案1】:创建 HTTP 触发的 Azure 函数时,默认设置为授权级别 = Function,这意味着任何尝试通过其 URL 调用该函数的应用都需要知道为该函数生成的特定访问密钥创建时。
在您的示例中,您的 Web API 会将该函数的调用 URL 和访问密钥存储在其配置中,并使用该密钥调用您的函数。由于密钥完全保留在 Azure 上的服务器端,因此没有其他人可以访问它,因此它是完全安全的。
根据您的要求,您还可以在访问密钥机制之上分层其他类型的授权/身份验证(例如不记名令牌),或使用这些代替访问密钥(通过设置允许匿名访问的功能)。
为了获得最大的安全性,我建议首先使用函数访问密钥,以确保除了您的应用之外没有人可以成功调用该函数,然后传递并验证承载令牌以确保应用尝试调用确实允许该功能这样做。
请注意,Azure Functions 与标准 ASP.NET Core 略有不同,尤其是在中间件方面,它是 doesn't really support yet,因此您可能需要编写自己的代码来从传入的 HTTP 请求的标头,并验证其是否有效。
参考:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=csharp#authorization-keys
【讨论】:
谢谢伊恩,我会试试的。我认为,至少目前,默认的访问密钥授权级别会很好用。正如您所说,Web API 和 Function 都托管在 Azure App Service 上,因此将访问密钥存储在配置文件中可能是可以的。【参考方案2】:对于这个要求,你只需要启用你的函数应用的“Authentication/Authorization”。
按照上面截图中的步骤,当你点击第四个红色框时,选择“Express”标签,然后点击页面底部的“ok”,没有做任何事情。它将在您的 Azure AD 中创建一个与您的函数应用同名的应用程序。
之后,当你在浏览器中请求函数应用 url 时,它会要求你登录。
更多详细步骤,可以参考这个document。
【讨论】:
【参考方案3】:取决于您所说的身份验证。 如果您只想保护您的功能,您可以使用授权级别 = 功能。 但是,如果您需要登录身份验证,并且您需要知道发出请求的用户,则必须将不记名令牌与 OpenIDConnect 服务器一起使用。 无论您使用哪种方法,都始终使用无状态身份验证。
【讨论】:
以上是关于身份验证如何在 Azure Functions 上工作的主要内容,如果未能解决你的问题,请参考以下文章
如何使用应用服务对 Azure Functions 应用进行身份验证/授权?
如何在使用 .NET Core 3.1 通过 Visual Studio 2019 开发 Azure Functions 时使用 AD 身份验证