在本地开发 Azure 函数

hor*_*ius 6 restful-authentication azure azure-api-management azure-ad-b2c azure-functions

我领导着一个庞大的 azure 函数开发团队。因此,Microsoft 引用的大多数使用 azure Web 界面的示例对我都不起作用。我正在使用模拟器在本地开发 Azure 函数以节省一些成本。我通过 Visual Studio 将所有功能发布到我的集成环境中。

我正在开发一堆需要 api 网关来处理使用 Azure AD B2C 的身份验证工作流的 azure 函数。现在,没有可以在本地运行的 api 网关模拟器或 Azure AD B2C 模拟器。我的身份验证工作流程涉及拦截对 api 的请求,将它们重定向到 AD B2C 进行身份验证,随后将 auth-token 添加到 http 标头,然后调用 http 触发的 azure 函数。

现在,问题变成了,我如何测试身份验证工作流程?如何设置 api 网关以将我在 Visual Studio 中本地运行的函数注册为云中 api 网关的 api 端点?

Dav*_*tes 8

如果您正在开发通过Easy Auth使用 Azure-AD 或 Azure B2C 的 SPA,这是另一种选择,它将为您执行 JWT 令牌验证,并让您执行以下操作:

您的 SPA 甚至会在本地获得令牌,因此请执行以下操作:

  1. ClaimPrincipal注入您的函数
  2. 检查用户是否已通过身份验证(例如,principal.Identity.IsAuthenticated),如果未通过,则返回 UnauthorizedResult。
  3. 检查发行人索赔。如果委托人有一个,它通过了 Express Auth.,你的 JWT 令牌由它验证,你可以立即从中获得你的声明。
  4. 如果没有发行者,则是本地开发,您可以转向标头并自己提取 JWT 令牌并获得您的声明。您也可以将其用于有条件的构建,以便您双重确定它是本地开发。

下面是一些从头中提取 JWT 令牌的示例代码(HttpRequest 被注入到每个函数中):

private JwtSecurityToken ReadJwtTokenFromHeader(HttpRequest req)
{
   if (req.Headers.ContainsKey("Authorization"))
   {
       var authHeader = req.Headers["Authorization"];
       var headerValue = AuthenticationHeaderValue.Parse(authHeader);

       var handler = new JwtSecurityTokenHandler();
       return handler.ReadJwtToken(headerValue.Parameter);
   }

   return null;
}
Run Code Online (Sandbox Code Playgroud)

注意:这需要 System.IdentityModel.Tokens.Jwt NuGet 包才能使用 JwtSecurityTokenHandler。


Eri*_*sen 1

我做了什么:

  1. 添加了一个“授权”API,用于处理针对外国当局的通用授权。此 API 返回我自己的 JWT 以及我自己的自定义声明,该声明会持续一段有限的时间。
  2. 更改了我的所有其他 API 以使用我的自定义 JWT。

优点:

  • 超级容易在本地测试。我只是将 #if DEBUG 部分添加到授权 API 中以跳过正常授权并为我提供我设计的 JWT。
  • 我可以在声明中放入任何我想要的内容,因此我将其用作缓存以减少外部授权调用。