【问题标题】:Https and Http only on .net webapi v2 actionsHttps 和 Http 仅适用于 .net webapi v2 操作
【发布时间】:2015-09-12 00:53:08
【问题描述】:

我一直在使用 oauth 2(准确地说是 openid 连接)不记名令牌来授予访问权限的 webapi 2 项目。现在整个想法是,承载令牌只有在与安全连接一起使用时才是安全的。

到目前为止,我根本不允许对网络服务器进行 http 调用,这有点工作,因为没有人可以使用不记名令牌进行 http 调用。

我们现在有一些端点需要通过 http 可用(不需要承载令牌/身份验证),我们当然要启用 http。现在我的问题是,在这些情况下什么是正常的?

我是否有一个属性可以用于所有只接受 https 的操作? 我可以将其设为默认行为,并且只将属性放在那些在 http 上没问题的属性上吗?

建议是什么,我们有责任在不安全的线路上使用 oauth 令牌还是 API 的用户?

【问题讨论】:

    标签: asp.net-web-api


    【解决方案1】:

    我认为正确的做法是添加全局操作过滤器,强制您在 Web API 上的所有控制器/操作上使用 HTTP。此 HTTPs 操作过滤器的实现如下:

    public class ForceHttpsAttribute : AuthorizationFilterAttribute
    {
        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            var request = actionContext.Request;
    
            if (request.RequestUri.Scheme != Uri.UriSchemeHttps)
            {
                var html = "<p>Https is required</p>";
    
                if (request.Method.Method == "GET")
                {
                    actionContext.Response = request.CreateResponse(HttpStatusCode.Found);
                    actionContext.Response.Content = new StringContent(html, Encoding.UTF8, "text/html");
    
                    UriBuilder httpsNewUri = new UriBuilder(request.RequestUri);
                    httpsNewUri.Scheme = Uri.UriSchemeHttps;
                    httpsNewUri.Port = 443;
    
                    actionContext.Response.Headers.Location = httpsNewUri.Uri;
                }
                else
                {
                    actionContext.Response = request.CreateResponse(HttpStatusCode.NotFound);
                    actionContext.Response.Content = new StringContent(html, Encoding.UTF8, "text/html");
                }
    
            }
        }
    }
    

    现在您要在 WebApiConfig 类上全局注册它,如下所示:

    config.Filters.Add(new ForceHttpsAttribute());
    

    我从你的问题中了解到,你想通过 https 调用它们的控制器数量大于通过 http 的控制器,所以你想为这些 http 控制器添加覆盖属性[OverrideActionFiltersAttribute] 不要忘记使用[AllowAnonymous] 属性为您的匿名控制器添加属性。 但我的建议是通过 https 保持所有通信,您只允许匿名调用。 您可以在我的博客上阅读更多关于执行 https 的信息:http://bitoftech.net/2013/12/03/enforce-https-asp-net-web-api-basic-authentication/ 希望这会有所帮助。

    【讨论】:

    • 这是我一直在寻找的确切答案。哇。答案组织得井井有条,解释并轻松传达了信息。感谢@taisser joudeh 花时间为世界做好事。 .!我也想建议将此标记为答案。
    【解决方案2】:

    首先,我认为您肯定必须尽最大努力确保该令牌的安全性,因此服务器应该强制执行 SSL。

    我们正在使用 web api v1(基础设施限制 :(),并且我们有一个全局 DelegatingHandler 对所有请求强制执行 SSL,但白名单上的某些 uri 除外(这不是最漂亮的解决方案,但它现在可以工作)。

    在 web api 2 中,我认为您可以使用全局 FilterAttribute 来强制 SSL 连接,然后使用新的属性覆盖功能 http://dotnet.dzone.com/articles/new-filter-overrides-feature 创建您的例外 - 虽然都是理论上的! :)

    希望有所帮助 加勒特

    【讨论】:

      猜你喜欢
      • 2018-07-26
      • 2015-08-18
      • 2015-02-15
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      相关资源
      最近更新 更多