Azure功能的过滤器

时间:2017-10-11 09:43:46

标签: azure azure-functions azure-webjobssdk

是否可以为Azure功能设置过滤器(Auth或Exception)?我只是想不重复代码来验证每个函数中的承载令牌。我看到webjobs sdk中有一个过滤器概念。 https://github.com/Azure/azure-webjobs-sdk/wiki/Function-Filters

我想在执行任何功能之前只验证持有者令牌。因此,如果过滤器不是最佳选择,那么还有其他更好的方法来处理这种情况吗?

2 个答案:

答案 0 :(得分:2)

根据您希望回复的功能丰富功能,您可以使用已过滤的功能,但在此问题完成之前,它们目前非常有限 - https://github.com/Azure/azure-webjobs-sdk/issues/1314

或者,您可以在每个功能中设置管道,以便在功能应用程序中应用相同的横切关注逻辑。显然,这将是一项更多的工作,但具有更大的灵活性。

示例 - https://github.com/kevbite/AzureFunctions.GreenPipes

答案 1 :(得分:0)

您可以仅将函数代码作为参数传递给包装方法,而不必引入另一个程序包。

//business logic
[FunctionName("PostWidget")]
public async Task<IActionResult> PostWidget(
  [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "widgets")] Widget item, HttpRequest req, ILogger log)
{
  return await _functionWrapper.Execute(req, item, async () =>
  {
    log.LogInformation($"posting widget: ${item.Id}");

    var newItem = await dbContext.Widgets.AddAsync(item);
    await dbContext.SaveChangesAsync();

    return new ResponseEnvelopeResult<Widget>(HttpStatusCode.Created, newItem.Entity);
  });
}

//functionWrapper class
public async Task<IActionResult> Execute(T model, HttpRequest req, Func<Task<IActionResult>> azureFunction)
{
  var results = await _validator.ValidateAsync(model, ruleSet: $"default,audit,{req.Method}");
  if (!results.IsValid)
  {
    var errors = results.Errors.Select(x => x.ErrorMessage).ToList();
    _log.LogWarning($"Model validation failed for type '{typeof(T).Name}'. Validation errors: [{errors.Join()}] ");
    return new ResponseEnvelopeResult<T>(HttpStatusCode.BadRequest, null, errors);
  }

  try
  {
    return await azureFunction();
  }
  catch (Exception e)
  {
    _log.LogError(e, "Unhandled exception occured in FunctionWrapper");
    return new ResponseEnvelopeResult<T>(HttpStatusCode.InternalServerError, null, new[] { e.Message });
  }
}

然后可以设置包装器以进行验证,检索用户信息等。如果需要将项目传递回功能层,则可以轻松地这样做,而不会模糊您的功能意图。我的博客上有一个很大的示例。

https://blog.bruceleeharrison.com/2019/09/04/azure-v2-functions-with-fluentvalidation/