403(禁止)从另一个

时间:2018-03-22 13:29:23

标签: azure azure-functions http-status-code-403

我需要调用azure函数; fn(b),来自另一个天蓝色的函数; FN(a)中。

fn(a) - > FN(b)中

这两个功能都在同一个功能应用程序中。问题是每当我尝试拨打(b)时,我得到403-Forbidden"根级别的数据无效"。

是否可以从同一功能应用程序中的另一个azure函数调用azure函数?

功能1

public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
            HttpRequestMessage req, TraceWriter log)
        {
            log.Info("---- C# HTTP trigger function 1 processed a request.");

            UploadToF2(log);
            return null;
        }

        private static IRestResponse UploadToF2(TraceWriter log)
        {
            SomeObject payload = new SomeObject();
            payload.One = "One";
            payload.Two = 2;
            payload.Three = false;
            payload.Four = 4.4;

            var Fn2Url = Convert.ToString(ConfigurationManager.AppSettings["F2Url"]);
            log.Info("Hitting F2 at " + Fn2Url);
            var method = Method.POST;
            var client = new RestClient(Fn2Url);
            var body = JsonConvert.SerializeObject(payload);

            var request = new RestRequest(method);
            request.RequestFormat = DataFormat.Json;
            request.AddHeader("Content-Type", "application/json");

            request.AddBody(payload); // uses JsonSerializer

            IRestResponse response = client.Execute(request);
            return response;
        }
    }

    class SomeObject
    {
        public string One { get; set; }
        public int Two { get; set; }
        public bool Three { get; set; }
        public double Four { get; set; }
    }

功能2

public static class Function2
    {
        [FunctionName("Function2")]
        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
        {
            log.Info("---- C# HTTP trigger function 2 processed a request.");
            string payload = await req.Content.ReadAsStringAsync();
            log.Info("payload == "+payload);

            return null;
        }
    }

其他信息:

  1. F2Url是来自config的完全限定网址。
  2. 我尝试在localhost中运行这两个函数。有用。即fn(a)可以在localhost中调用fn(b)。但是,当我在Azure中托管它们时,fn(b)不能从fn(a)调用。
  3. 我也尝试过混合测试。即我在本地保留了一个功能,在Azure中保留了另一个功能。它也是这样的。即我将fn(a)保存在本地,fn(b)保存在Azure中,fn(b)可以调用。
  4. 我尝试直接从邮递员那里拨打fn(b),然后再次工作。
  5. authLevel对两个函数都是匿名的
  6. 我对功能应用程序应用了IP限制(平台功能&gt;网络&gt; IP限制)。当我删除I​​P限制时,Function1能够调用Function2。但是,如果保留IP限制,则不允许进行呼叫。
  7. 当fn(a)无法调用fn(b)时,唯一的条件是这两个函数都在Azure中托管。

3 个答案:

答案 0 :(得分:2)

  从另一个

调用一个azure函数时,

403(禁止)

如果不在IP限制中添加客户端IP,那么您在客户端测试它将得到403错误。如果不在IP限制中添加客户端IP,不仅可以从另一个调用azure函数,还可以限制所有函数。

在您的情况下,您需要在IP限制中添加测试client Ip,然后它才能正常工作。

enter image description here

enter image description here

<强>更新

添加测试结果。

enter image description here

答案 1 :(得分:0)

使用时通过GET本地工作到Function1:

var Fn2Url = "http://localhost:7071/api/Function2";

您在配置中使用了什么价值?

答案 2 :(得分:0)

  1. 通过其完整网址调用函数#2,因为在请求进入您的功能应用之前,首先会有一个前端层被点击。即使在同一个功能应用程序中相互调用的函数也是如此。

    GET https://{func-app-name}.azurewebsites.net/api/function2
    
  2. 如果authLevel中的function.json不是匿名的,请将API密钥作为?code=传递 -

    https://{func-app-name}.azurewebsites.net/api/function2?code={API-key}
    

    或作为标题 -

    GET https://{func-app-name}.azurewebsites.net/api/function2
    x-functions-key: {API-key}
    
  3. 在本地运行时(Visual Studio / func host start),忽略authLevel的值。看着你的装饰者,AuthorizationLevel.Anonymous存在,所以很可能不是它。

    更多关于authorization keys here

    最重要的是,你可以做得更好,在功能#2中返回null200 OK202 Accepted204 No Content,所有有效的选择取决于应该是什么接下来发生(异步/同步处理)。