#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())
});