Веб-API 2 Требовать HTTPS, позволяющие HTTP-соединение

В контроллере MVC Web API 2 я создал следующее действие:

    [ResponseType(typeof(int))]
    [RequireHttps]
    public IHttpActionResult SaveLead(EcommerceLead lead)
    {
    }

Но в моем тестовом приложении я звоню

http://localhost/api/savelead

И он работает. Есть ли способ заставить действие работать только при вызове https, т.е. Вернуть 404, если это не так или что-то?

Ответ 1

Если вы используете RequireHttps из пространства имен Mvc, это не будет работать с Web API. Вы можете написать простой фильтр для веб-API самостоятельно, чтобы обеспечить соблюдение HTTPS. Поскольку вы используете Web API 2, создайте такой фильтр проверки подлинности.

public class RequireHttpsAttribute : IAuthenticationFilter
{
    public bool AllowMultiple
    {
        get { return true; }
    }

    public Task AuthenticateAsync(HttpAuthenticationContext context, 
                                        CancellationToken cancellationToken)
    {
        if (context.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            context.ActionContext.Response = new HttpResponseMessage(
                                    System.Net.HttpStatusCode.Forbidden);

        }
        return Task.FromResult<object>(null);
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context,
                                        CancellationToken cancellationToken)
    {
        return Task.FromResult<object>(null);
    }
}

Ответ 2

Если вы используете устаревшую версию web api, вы можете использовать фильтр Authoriztion.

public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                ReasonPhrase = "HTTPS Required"
            };
        }
        else
        {
            base.OnAuthorization(actionContext);
        }
    }
}

Ответ 3

You can use Message Handler.

public class RequireHttpsHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
if (request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
return Task.FromResult(new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "HTTPS Required"
});
}
return base.SendAsync(request, cancellationToken);
}
}