Возвращает неверный запрос для всех вызовов, выполненных по http

#c# #asp.net-core #asp.net-core-mvc #asp.net-core-2.0 #http-redirect

#c# #asp.net-core #asp.net-core-mvc #asp.net-core-2.0 #http-перенаправление

Вопрос:

Я пытаюсь выяснить, как я могу вернуть неверный запрос, когда вызов выполняется по HTTP-соединению, в отличие от https. Единственный способ, которым я мог бы выяснить, как это сделать, — написать промежуточное программное обеспечение и проверять каждый запрос следующим образом:

 public class HttpRequestInterceptor
{
    private readonly RequestDelegate _next;

    public HttpRequestInterceptor(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        var scheme = context.Request.Scheme;
        if (scheme.Equals("http", StringComparison.InvariantCultureIgnoreCase))
        {
            context.Response.StatusCode = 400;
            context.Response.ContentType = "application/json";
            await context.Response.WriteAsync("{"result:" "Bad Request"}", Encoding.UTF8);
            return;
        }

        await _next.Invoke(context);
    }
}
  

Есть ли лучший способ сделать это? Может быть, встроенный способ через фреймворк?

Комментарии:

1. Почему бы вам не использовать UseHttpsRedirection() промежуточное программное обеспечение вместо этого?

2. @MoienTajik насколько я понимаю, как работает эта функция, она перенаправит страницу с http на https. Хотя это хорошо для веб-сайтов, для API лучше всего либо не прослушивать http, либо возвращать неверный запрос, чтобы гарантировать невозможность атаки «человек посередине». Я выбираю вернуть неверный запрос. Смотрите здесь: learn.microsoft.com/en-us/aspnet/core/security /…

Ответ №1:

Вы можете создать пользовательский фильтр, подобный этому, используя RequireHttpsAttribute:

 /// <summary>
/// An authorization filter that closes connections if they are not secure (HTTPS).
/// Be aware that sensitive information sent by the client WILL be visible!
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class RequireHttpsOrCloseAttribute : RequireHttpsAttribute
{
    protected int StatusCode { get; }

    /// <summary>
    /// Return a status result with the given status code when the request does not use HTTPS.
    /// </summary>
    /// <param name="statusCode"></param>
    public RequireHttpsOrCloseAttribute(int statusCode)
    {
        StatusCode = statusCode;
    }

    /// <summary>
    /// Return a 400 Bad Request status code result when the request does not use HTTPS.
    /// </summary>
    public RequireHttpsOrCloseAttribute()
     : this(400)
    {
    }

    /// <summary>
    /// Sets the status result to the appropriate StatusCodeResult specified in the constructor.
    /// The default is 400 Bad Request.
    /// </summary>
    /// <param name="filterContext"></param>
    protected override void HandleNonHttpsRequest(AuthorizationFilterContext filterContext)
    {
        filterContext.Result = new StatusCodeResult(StatusCode);
    }
}
  

И затем вы можете зарегистрировать его глобально в своем приложении:

 services.AddMvc(opt =>
{
    opt.Filters.Add(new RequireHttpsOrCloseAttribute())
});