当我运行azure HTTP触发功能时,我得到了401未授权

时间:2018-07-02 06:41:16

标签: azure azure-functions

我正在尝试运行Azure HTTP触发器Azure函数,并且收到401 Unauthorized。以前对我来说很好。

当我在同一功能应用程序下创建新功能并复制相同的代码时,它也可以正常运行,但是当我尝试运行自己创建的功能时,却遇到了我提到的相同错误。

我在流媒体服务中看到以下日志。

  

2018-07-02T07:09:41欢迎,您现在已连接到日志流服务。

     

2018-07-02T07:09:48.893 [Info]执行HTTP请求:{     “ requestId”:“ 53e54698-c46b-4cb6-9ed0-d042eaf9ec71”,     “ method”:“ POST”,     “ uri”:“ / api / Source / MPAA / false”   }

     

2018-07-02T07:09:48.893 [Info]执行的HTTP请求:{     “ requestId”:“ 53e54698-c46b-4cb6-9ed0-d042eaf9ec71”,     “ method”:“ POST”,     “ uri”:“ / api / Source / MPAA / false”,     “ authorizationLevel”:“匿名者”,     “状态”:“未经授权”   }

4 个答案:

答案 0 :(得分:0)

如果要通过azure门户管理代码,则只需导航至“集成”并将“授权级别”下拉列表更改为“匿名”。 enter image description here

如果您要通过源代码控制集成(例如,通过git)管理代码,请将其添加到function.json

"authLevel": "anonymous"

function.json的完整摘要:

{
  "bindings": [
    {
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [ "post" ],
      "route": "Source/MPAA",
      "authLevel": "anonymous"
    },
    {
      "type": "http",
      "name": "res",
      "direction": "out"
    }
  ],
  "disabled": false
}

注意:以上仅是示例,您可能需要调整路线。 注意:/ api是默认前缀,可以在host.json文件中进行修改。

答案 1 :(得分:0)

基于上面尼克正确提供的原因,这就是我解决问题的方法:

在函数的源代码中:

[FunctionName("YourFunctionName")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    ILogger log){

要做的是将AuthorizationLevel.Function更改为AuthorizationLevel.Anonymous。如果您不想为Azure门户GUI的每个功能添加额外的步骤,而只是为了使它们正常工作,则可以使用该功能。

答案 2 :(得分:0)

关于函数的身份验证级别。 如果您在function.json文件中使用 authlevel = 匿名。然后,您无需传递任何访问密钥,就可以像普通api端点一样访问azure函数api。

{
"disabled": false,    
"bindings": [
    {
        "authLevel": "anonymous",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req"
    },
    {
        "type": "http",
        "direction": "out",
        "name": "res"
    }
]

}

例如,您的http触发器是 http:// .azurewebsites.net / api / ,则无需任何访问/身份验证密钥即可轻松访问此页面。

如果您使用的是 authlevel = 功能,那么您必须在点击时将访问密钥/ Api密钥与http触发端点一起传递。如果您不这样做,则会得到 401未经授权

    {
"disabled": false,    
"bindings": [
    {
        "authLevel": "function",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req"
    },
    {
        "type": "http",
        "direction": "out",
        "name": "res"
    }
]

}

您需要像下面的示例一样传递密钥。 ** https:// .azurewebsites.net / api / ?code = **

对于 authlevel = 功能,您可以通过功能键访问http触发器 和主机密钥。在Azure门户中打开功能时,您会找到获取功能网址部分。

注意 使用主机密钥,您可以访问所有http触发器端点,这对于所有http触发器都是通用的。但是功能键对于每个功能都是唯一的。

第三个选项是使用 authlevel = admin

{
"disabled": false,    
"bindings": [
    {
        "authLevel": "admin",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req"
    },
    {
        "type": "http",
        "direction": "out",
        "name": "res"
    }
]

}

对于身份验证级别的管理员,只能通过主密钥访问http触发器。 ** https:// .azurewebsites.net / api / ?code = **

您将在获取功能网址部分中按照身份验证级别找到所有这些键。 authlevel的完整指南在此链接中。 Azure Functions HTTP trigger function authlevel Explanation

我希望这会有所帮助。

答案 3 :(得分:0)

我也开始使用 {$ifdef FullDebugMode} LblFastMM4.Visible := true; {$endif} {$ifdef EnableMemoryLeakReporting} LblFastMM4.Visible := true; {$endif} ,直到我意识到我有两个具有相同路由的函数。那显然把 Azure 弄糊涂了。

检查是否有相同路由的不同功能。