0

我在 C# 中有一个带有“HTTP Trigger”的天蓝色函数。当我使用“HTTP 触发器”调用 azure 函数时,我想将消息记录到队列存储中。

当调用“HTTP 触发器”时,它会在其他地方记录一条消息(log.info(“C# Http 触发器....”);),但我想将此日志消息与 ipaddress 一起记录,(当用户向“HTTP 触发器”发出请求时“函数)存储在队列存储(log.info(“C#队列触发器”,ipaddress))中,这样我就可以阻止客户端ipaddress一天,如果用户对api的调用超过了尝试次数,第二天我再次可以通过从队列存储中获取所有 ipaddress 来取消阻止客户端 ipaddress,从而在云中运行计时器触发器。

是否有可能实现这一点,否则除了队列存储之外,还有其他存储 ipaddress 的方法吗?

4

2 回答 2

1

从你写的我猜,你想为你的用户提供某种 API 并希望限制访问。为此,我宁愿建议使用 Azure API 管理 ( https://azure.microsoft.com/en-us/services/api-management/ )。它为您提供访问报价,根据不同的标准限制用户对 API 端点的访问。它还提供更多功能:用户管理、支付、订阅、安全等等。

于 2017-10-12T21:34:02.447 回答
0

要使用 HTTP 触发器在 Azure 函数下检索客户端 IP,可以使用以下代码片段:

运行.csx:

#r "System.Web"

using System.Web;
using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log)
{   
    var address = ((HttpContextWrapper)req.Properties["MS_HttpContext"]).Request.UserHostAddress;
    log.Info($"Your client IP: {address}");
    return req.CreateResponse(HttpStatusCode.OK, $"Your client IP: {address}");
}

有关更多详细信息,您可以参考此问题

这样我就可以阻止客户端 ipaddress 一天,如果用户对 api 的调用超过尝试次数,第二天我可以通过从队列存储运行计时器触发器中获取所有 ipaddress 来取消阻止客户端 ipaddress。

我更喜欢使用表存储来存储特定 IP 的访问日志。您可以将PartitionKey列设置为 Date、设置RowKeyClientIPor ClientIP + ApiName,也可以添加其他列(Timestamp、TotalRequests 等)。此外,您可以参考Azure 存储表设计指南来设计存储表。

对于您的 azure 功能,您可以使用存储表绑定表存储 SDK来读取特定 IP 的请求日志并更新特定 IP 的总请求数。此外,这里有一个类似的博客,你可以参考这里

更新:

您可以将日志配置为存储在“监控 > 诊断日志”下的文件系统或 blob 存储中,如下所示:

在此处输入图像描述

在此处输入图像描述

对于应用程序日志记录(文件系统),您可以通过kudu找到日志:

在此处输入图像描述

对于应用程序日志记录 (Blob),您可以利用存储资源管理器来检索您的日志。

于 2017-10-13T02:37:49.430 回答