Это более белый список, чем авторизация. Авторизация означает проверку, имеет ли пользователь разрешение на что-либо. Чтобы сделать это, пользователь должен быть сначала идентифицирован, ie аутентифицирован.
В статье Safelist IP-клиента в документации показано, как можно реализовать списки надежных IP-адресов с помощью промежуточного программного обеспечения, фильтра действий или фильтра Razor Pages.
Промежуточное программное обеспечение для всего приложения
Опция промежуточного программного обеспечения применяется ко всему приложению. Пример кода извлекает IP-адрес конечной точки запроса, проверяет его по списку безопасных идентификаторов и позволяет продолжить вызов, только если он поступил из «безопасного» списка. В противном случае возвращается предопределенный код ошибки, в данном случае 401:
public async Task Invoke(HttpContext context)
{
if (context.Request.Method != "GET")
{
var remoteIp = context.Connection.RemoteIpAddress;
_logger.LogDebug("Request from Remote IP address: {RemoteIp}", remoteIp);
string[] ip = _adminSafeList.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.LogInformation(
"Forbidden Request from Remote IP address: {RemoteIp}", remoteIp);
context.Response.StatusCode = 401;
return;
}
}
await _next.Invoke(context);
}
В статье показано, как зарегистрировать его до UseMvc()
, что означает, что запрос будет отклонен до достижения промежуточного программного обеспечения MVC:
app.UseMiddleware<AdminSafeListMiddleware>(Configuration["AdminSafeList"]);
app.UseMvc();
Таким образом, мы не тратим время процессора и не обрабатываем запрос, который все равно будет отклонен. Опция промежуточного программного обеспечения является хорошим выбором для реализации списка black .
Фильтр действий
Код фильтрации по сути тот же, на этот раз определено в классе, производном от ActionFilterAttribute. Фильтр определяется как служба с областью действия:
services.AddScoped<ClientIpCheckFilter>();
services.AddMvc(options =>
{
options.Filters.Add
(new ClientIpCheckPageFilter
(_loggerFactory, Configuration));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
В этом случае запрос достигнет инфраструктуры MVC, прежде чем он будет принят или отклонен.
Фильтр бритвенных страниц
Код снова такой же, на этот раз получаемый из IPageFilter