引言
这篇展现了怎样在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 请求,将绕过此认证全过程。
publicclassAdminSafeListMiddleware{privatereadonlyRequestDelegate_next;privatereadonlyILogger<AdminSafeListMiddleware>_logger;privatereadonlystring_safelist;publicAdminSafeListMiddleware(RequestDelegatenext,ILogger<AdminSafeListMiddleware>logger,stringsafelist){_safelist=safelist;_next=next;_logger=logger;}publicasyncTaskInvoke(HttpContextcontext){if(context.Request.Method!=HttpMethod.Get.Method){varremoteIp=context.Connection.RemoteIpAddress;_logger.LogDebug("RequestfromRemoteIPaddress:{RemoteIp}",remoteIp);string[]ip=_safelist.Split(';');varbytes=remoteIp.GetAddressBytes();varbadIp=true;foreach(varaddressinip){vartestIp=IPAddress.Parse(address);if(testIp.GetAddressBytes().SequenceEqual(bytes)){badIp=false;break;}}if(badIp){_logger.LogWarning("ForbiddenRequestfromRemoteIPaddress:{RemoteIp}",remoteIp);context.Response.StatusCode=StatusCodes.Status403Forbidden;return;}}await_next.Invoke(context);}}
实际操作挑选器
假如必须对于特殊 MVC 控制板或操作步骤的安全性安全密钥管理,请应用实际操作挑选器。 例如:。
publicclassClientIpCheckActionFilter:ActionFilterAttribute{privatereadonlyILogger_logger;privatereadonlystring_safelist;publicClientIpCheckActionFilter(stringsafelist,ILoggerlogger){_safelist=safelist;_logger=logger;}publicoverridevoidOnActionExecuting(ActionExecutingContextcontext){varremoteIp=context.HttpContext.Connection.RemoteIpAddress;_logger.LogDebug("RemoteIpAddress:{RemoteIp}",remoteIp);varip=_safelist.Split(';');varbadIp=true;if(remoteIp.IsIPv4MappedToIPv6){remoteIp=remoteIp.MapToIPv4();}foreach(varaddressinip){vartestIp=IPAddress.Parse(address);if(testIp.Equals(remoteIp)){badIp=false;break;}}if(badIp){_logger.LogWarning("ForbiddenRequestfromIP:{RemoteIp}",remoteIp);context.Result=newStatusCodeResult(StatusCodes.Status403Forbidden);return;}base.OnActionExecuting(context);}}
在中国 Startup.ConfigureServices ,将实际操作挑选器加上到 MVC 挑选器结合。 在下面的实例中, ClientIpCheckActionFilter 加上了一个实际操作挑选器。 安全性日志和控制面板监控软件案例做为结构函数参数开展传送。
services.AddScoped<ClientIpCheckActionFilter>(container=>{varloggerFactory=container.GetRequiredService<ILoggerFactory>();varlogger=loggerFactory.CreateLogger<ClientIpCheckActionFilter>();returnnewClientIpCheckActionFilter("127.0.0.1;192.168.1.5;::1",logger);});
随后,可以将实际操作挑选器运用到具备 [ServiceFilter] 特性的控制板或操作步骤:
[ServiceFilter(typeof(ClientIpCheckActionFilter))][HttpGet]publicIEnumerable<string>Get()
在实例运用中,实际操作挑选器将运用于智能控制器的 Get 操作步骤。 如果你根据推送来检测应用软件时:
HTTP GET 要求,该 [ServiceFilter] 特性认证手机客户端 IP 详细地址。 假如容许浏览 Get 操作步骤,则 "实际操作挑选器" 和 "实际操作" 方式将转化成下列控制面板輸出的组合:
dbug:ClientIpSafelistComponents.Filters.ClientIpCheckActionFilter[0]RemoteIpAddress:::1dbug:ClientIpAspNetCore.Controllers.ValuesController[0]successfulHTTPGET
除 GET 以外的 HTTP 要求谓词演算将 AdminSafeListMiddleware 认证手机客户端 IP 详细地址。
汇总
该实例彻底可以更新改造成信用黑名单阻拦。