将数据从Azure函数过滤器传递到函数

时间:2017-10-11 12:33:13

标签: azure jwt azure-functions azure-ad-b2c azure-webjobssdk

我已将Bearer Token Validation委托给Azure Function Invocation Filter。它验证令牌并获得声明。现在我试图将这些声明或ClaimsPrincipal对象传递给函数。

     public override Task OnExecutingAsync(
                FunctionExecutingContext executingContext, CancellationToken cancellationToken)
     {
             var handler = new JwtSecurityTokenHandler();
             handler.InboundClaimTypeMap.Clear();
             principal = handler.ValidateToken(jwtToken,
                    new TokenValidationParameters
                    {
                        ValidateAudience = false,
                        ValidIssuer = issuer,
                        ValidateIssuerSigningKey = false,
                        SignatureValidator = (t, param) => new 
                                                        JwtSecurityToken(t),
                        NameClaimType = "sub"

                    }, out var token);
     }

我在Properties中看到一个名为FunctionExecutingContext的词典。但根据文档,它用于在过滤器之间传递数据。

因此executingContext.Properties["claims"] = principal;无法将数据传递给函数。

我们可以在WebAPI中使用RouteData来实现它,但不确定是否可以在Azure Functions中执行此操作。任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:0)

您的选项有点受限 - 没有像Request.Properties那样检查通用属性包。 您可以将Filter与您的函数放在一个类上,然后过滤器可以在执行时设置实例字段;并且您的函数可以读取字段。您可能需要设置JobActivator并确保每次调用都获得一个新的类实例。

答案 1 :(得分:0)

我不知道您是否已找到解决方案,但是当您将该功能用作http触发器时,有一个解决方案。你函数的第一个参数是HttpRequestMessage对象(req)。在过滤器中检索此参数,如下所示:

HttpRequestMessage req = (HttpRequestMessage)executingContext.Arguments.First().Value;

您可以使用req。属性添加自定义数据并从函数内部读取。