用于检查声明Azure功能的挂钩?

时间:2018-05-09 15:31:45

标签: azure azure-functions

假设我有两个Azure功能:

public static class MyFunctions
    [FunctionName("DoIt")]
    public static async Task<HttpResponseMessage> DoIt(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req,
        TraceWriter log)
    {}

    [FunctionName("DoSOmethingElse")]
    public static async Task<HttpResponseMessage> DoOther(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req,
        TraceWriter log)
    {}
}

然后我将Function AppService配置为需要AzureAD身份验证。假设我想要角色成员资格或其他声明等特定权限。我可以在每个方法顶部调用的函数中执行以下操作:

  • 检查承载令牌的req参数,解析JWT
  • 查看声明
  • 使用AuthenticationContext或其他JWT库获取Microsoft Graph令牌以获取其他数据

我的问题是可以选择执行以下任何操作吗?

  • 创建“挂钩前”功能,以便我在该类中编写或部署到服务容器的每个http函数都经过此检查
  • 通过属性执行这些授权吗?
  • 直接访问claimIdentity?

1 个答案:

答案 0 :(得分:2)

我找到了一些与你要找的相关的代码示例:

所以有趣的部分在这里(会给你一个主要的想法):

[FunctionName("GetClaims")]
public static HttpResponseMessage GetClaims(
  [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
  HttpRequestMessage request,
  TraceWriter log)
{
  if (Thread.CurrentPrincipal.Identity.IsAuthenticated)
    {
      var claimsPrincipal = (ClaimsPrincipal)Thread.CurrentPrincipal;
      var claims = claimsPrincipal.Claims.ToDictionary(c => c.Type, c => c.Value);
      // Could use the claims here. For this sample, just return it!
      return request.CreateResponse(HttpStatusCode.OK, claims, "application/json");
      }
      else
      {
        return request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Not Authorized");
      }
    }

简单的解决方案是创建一个获取声明的函数,然后可以在其他所有函数中调用此函数。

Azure功能有Function Filters(根据文档仍处于预览状态。)

  

函数过滤器提供了一种使用您自己的逻辑自定义WebJobs执行管道的方法。过滤器与ASP.NET过滤器非常相似。它们可以实现为可以应用于作业函数/类的声明性属性。

     

过滤器允许您封装要在多个不同功能之间共享的公共逻辑。它们还允许您集中逻辑以解决交叉问题(例如验证,记录,错误处理等)。

因此,您应该能够使用这些信息创建自定义授权过滤器。