Asp.Net Core安全防護-客戶端IP白名單限制


前言

本篇展示了如何在ASP.NET Core應用程序中設置IP白名單驗證的2種方式。

你可以使用以下2種方式:

  • 用於檢查每個請求的遠程 IP 地址的中間件。

  • MVC 操作篩選器,用於檢查針對特定控制器或操作方法的請求的遠程 IP 地址。

 

中間件

Startup.Configure方法將自定義 AdminSafeListMiddleware 中間件類型添加到應用的請求管道。 使用 .NET Core 配置提供程序檢索到該安全,並將其作為構造函數參數進行傳遞。

 

 

app.UseMiddleware<AdminSafeListMiddleware>("127.0.0.1;192.168.1.5;::1");

中間件將字符串分析為數組,並在數組中搜索遠程 IP 地址。 如果找不到遠程 IP 地址,中間件將返回 HTTP 403 禁止訪問。 對於 HTTP GET 請求,將跳過此驗證過程。

public class AdminSafeListMiddleware{    private readonly RequestDelegate _next;    private readonly ILogger<AdminSafeListMiddleware> _logger;    private readonly string _safelist;
    public AdminSafeListMiddleware(        RequestDelegate next,        ILogger<AdminSafeListMiddleware> logger,        string safelist)    {        _safelist = safelist;        _next = next;        _logger = logger;    }
    public async Task Invoke(HttpContext context)    {        if (context.Request.Method != HttpMethod.Get.Method)        {            var remoteIp = context.Connection.RemoteIpAddress;            _logger.LogDebug("Request from Remote IP address: {RemoteIp}", remoteIp);
            string[] ip = _safelist.Split(';');
            var bytes = remoteIp.GetAddressBytes();            var badIp = true;            foreach (var address in ip)            {                var testIp = IPAddress.Parse(address);                if (testIp.GetAddressBytes().SequenceEqual(bytes))                {                    badIp = false;                    break;                }            }
            if (badIp)            {                _logger.LogWarning(                    "Forbidden Request from Remote IP address: {RemoteIp}", remoteIp);                context.Response.StatusCode = StatusCodes.Status403Forbidden;                return;            }        }
        await _next.Invoke(context);    }}

操作篩選器

如果需要針對特定 MVC 控制器或操作方法的安全安全訪問控制,請使用操作篩選器。 例如:。

public class ClientIpCheckActionFilter : ActionFilterAttribute{    private readonly ILogger _logger;    private readonly string _safelist;
    public ClientIpCheckActionFilter(string safelist, ILogger logger)    {        _safelist = safelist;        _logger = logger;    }
    public override void OnActionExecuting(ActionExecutingContext context)    {        var remoteIp = context.HttpContext.Connection.RemoteIpAddress;        _logger.LogDebug("Remote IpAddress: {RemoteIp}", remoteIp);        var ip = _safelist.Split(';');        var badIp = true;
        if (remoteIp.IsIPv4MappedToIPv6)        {            remoteIp = remoteIp.MapToIPv4();        }
        foreach (var address in ip)        {            var testIp = IPAddress.Parse(address);
            if (testIp.Equals(remoteIp))            {                badIp = false;                break;            }        }
        if (badIp)        {            _logger.LogWarning("Forbidden Request from IP: {RemoteIp}", remoteIp);            context.Result = new StatusCodeResult(StatusCodes.Status403Forbidden);            return;        }
        base.OnActionExecuting(context);    }}

在中 Startup.ConfigureServices ,將操作篩選器添加到 MVC 篩選器集合。 在下面的示例中, ClientIpCheckActionFilter 添加了一個操作篩選器。 安全日志和控制台記錄器實例作為構造函數參數進行傳遞。

services.AddScoped<ClientIpCheckActionFilter>(container =>{    var loggerFactory = container.GetRequiredService<ILoggerFactory>();    var logger = loggerFactory.CreateLogger<ClientIpCheckActionFilter>();
    return new ClientIpCheckActionFilter(        "127.0.0.1;192.168.1.5;::1", logger);});

然后,可以將操作篩選器應用到具有 [ServiceFilter] 屬性的控制器或操作方法:

[ServiceFilter(typeof(ClientIpCheckActionFilter))][HttpGet]public IEnumerable<string> Get()

在示例應用中,操作篩選器將應用於控制器的 Get 操作方法。 當你通過發送來測試應用程序時:

  • HTTP GET 請求,該 [ServiceFilter] 屬性驗證客戶端 IP 地址。 如果允許訪問 Get 操作方法,則 "操作篩選器" 和 "操作" 方法將生成以下控制台輸出的變體:

dbug: ClientIpSafelistComponents.Filters.ClientIpCheckActionFilter[0]      Remote IpAddress: ::1dbug: ClientIpAspNetCore.Controllers.ValuesController[0]      successful HTTP GET

除 GET 之外的 HTTP 請求謂詞將 AdminSafeListMiddleware 驗證客戶端 IP 地址。

總結

該案例完全可以改造成黑名單攔截。

 

關注公眾號:UP技術控   獲取更多資訊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM