0

我正在构建一个带有 http 触发器的 Azure Functions v3 .NET Core 3.1 应用程序。我创建了从请求的 Authorization 标头中检索 jwt 并使用JwtSecurityTokenHandler. 如果我创建一个从 FunctionsStartup 继承的启动类,这将起作用。但是,如果我从 WebJobStartup 继承,我会遇到错误。应用找不到Microsoft.Extensions.Primitives.StringValues Microsoft.AspNetCore.Http.IHeaderDictionary.get_Item。我可以单步执行代码,但是任何尝试访问request.Headers字典中条目的函数都不会被执行并产生错误(下面的屏幕截图)。

访问请求上的授权标头时出错

这是代码。如果引用存在,调试器将不会进入GetJwtFromHeader函数:req.Headers

[FunctionName("HttpAuth")]
public async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
    ExecutionContext context,
    ILogger log)
{
    SomeFunction();
    var jwt = GetJwtFromHeader(req);
}

private string GetJwtFromHeader(HttpRequest req)
{
    var authorizationHeader = req.Headers?["Authorization"];
    string[] parts = authorizationHeader?.ToString().Split(null) ?? new string[0];
    return (parts.Length == 2 && parts[0].Equals("Bearer")) ? parts[1] : string.Empty;
}

调试器永远不会进入GetJwtFromHeader函数。如果我删除对 req.Headers 的引用,那么调试器将进入它。似乎任何试图通过代码访问 Header 字典的函数都找不到它。但是,如果我在监视窗口中检查对象,我会看到正确的值。

这可能是我的包中的版本控制问题吗?我尝试安装其他版本,Microsof.Extensions.Primitives但在降级到 5.0 以下的版本时遇到问题。为什么我的 Header 字典有问题?

4

1 回答 1

1

我解决了这个问题。在我正在导入的一个项目中,我使用 Microsoft.Extensions.Configuration 从我的秘密中读取条目,并且由于某种原因,5.0.0 版不能很好地与我的 Azure 函数项目配合使用。我将其降级为 3.1.13 并且有效。

于 2021-03-26T01:29:06.840 回答