Авторизуйте локальный хост в ASP. NET Core - PullRequest
0 голосов
/ 10 января 2020

Я новичок ie в ASP. NET Core, и у меня есть контроллер, мне нужно авторизовать его только на моей машине, для целей тестирования, однако, запретить на других ...

У меня есть следующая конфигурация:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddMvc().AddJsonOptions(options =>
    {
        options.SerializerSettings.DateFormatString= "yyyy-MM-ddTHH:mm:ssZ";
    });
    services.AddAuthentication("Cookie")
        .AddScheme<CookieAuthenticationOptions, CookieAuthenticationHandler>("Cookie", null);
    services.AddLogging(builder => { builder.AddSerilog(dispose: true); });

И на контролируемом тесте я включил [Authorise] attrubute

[Authorize]
public class OrderController : Controller

Есть ли способ разрешить моей локальной машине быть авторизован для доступа к действиям контроллера? Что-то вроде [Authorize(Allow=localhost)]

Ответы [ 2 ]

1 голос
/ 10 января 2020

Вы можете создать фильтр действий следующим образом:

public class LocalhostAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var ip = context.HttpContext.Connection.RemoteIpAddress;
        if (!IPAddress.IsLoopback(ip)) {
            context.Result = new UnauthorizedResult();
            return;
        }
        base.OnActionExecuting(context);
    }
}

И затем использовать тег Localhost:

//[Authorize]
[Localhost]
public class OrderController : Controller

Я считаю, что это будет работать, ограничивая доступ к машина, где он выполняется.

0 голосов
/ 10 января 2020

Это более белый список, чем авторизация. Авторизация означает проверку, имеет ли пользователь разрешение на что-либо. Чтобы сделать это, пользователь должен быть сначала идентифицирован, 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

...