WebApi中需要SSL吗?

EBa*_*arr 67 .net ssl asp.net-web-api

有没有办法要求WebApi的SSL?一个属性?

我没有看到适用的属性System.Web.Http,比如RequireHttps我们对MVC 的属性.我只是试图避免滚动我自己的属性/消息处理程序,如果有一个内置的解决方案.

The*_*ght 52

public class RequireHttpsAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 就像一个FYI一样,这段代码使用的`ActionFilterAttribute`类在`System.Web.Http.Filters`中.它不是``System.Web.Mvc`中的`ActionFilterAttribute`类. (12认同)
  • 对于那些想知道的人,在将其添加到某处之后,在您的类/操作之上添加`[RequireHttps]`.文件:http://www.asp.net/web-api/overview/security/working-with-ssl-in-web-api (5认同)
  • 这应该使用AuthorizationFilterAttribute,而不是ActionFilterAttribute.授权发生在管道中的早期,其他操作过滤器可能已经在您到达此处时运行.请参阅CularBytes的链接 (3认同)

Teo*_*gul 45

您可以使用WebAPIContrib项目中的RequireHttpsHandler.基本上,它只是检查传入的请求URI方案:

if (request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
  // Forbidden (or do a redirect)...
}
Run Code Online (Sandbox Code Playgroud)

或者,Carlos Figueira 在他的MSDN博客上有另一个实现.

  • 谢谢.我想是这么多,只是不想重新发明轮子,如果它是内置的. (2认同)

Adr*_*man 20

令人费解的是,ASP.NET Web API中没有与ASP.NET MVC RequireHttps属性等效的内容.但是,您可以根据MVC中的RequireHttps轻松创建一个.

using System;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;

...

public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext == null)
        {
            throw new ArgumentNullException("actionContext");
        }

        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            HandleNonHttpsRequest(actionContext);
        }
        else
        {
            base.OnAuthorization(actionContext);
        }
    }

    protected virtual void HandleNonHttpsRequest(HttpActionContext actionContext)
    {
        actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
        actionContext.Response.ReasonPhrase = "SSL Required";
    }
}
Run Code Online (Sandbox Code Playgroud)

剩下要做的就是争论有多少冗余代码.