Https和Http仅适用于.net webapi v2操作

时间:2014-09-16 14:52:53

标签: asp.net-web-api

我一直在使用webai 2进行一个项目,使用oauth 2(openid connect to be exact)bearer tokens来授予访问权限。现在整个想法是,如果使用安全连接,则承载令牌才是安全的。

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

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

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

有什么建议,我们有责任没有人在非安全线路上使用oauth令牌,或者是api的用户吗?

2 个答案:

答案 0 :(得分:4)

我认为正确的方法是添加全局操作过滤器,强制您在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控制器[OverrideActionFiltersAttribute] 不要忘记将您的匿名控制器归属为[AllowAnonymous]属性。 但我的建议是通过https保持所有通信,你只需要匿名呼叫。 您可以在此处详细了解如何在我的博客上执行https:http://bitoftech.net/2013/12/03/enforce-https-asp-net-web-api-basic-authentication/ 希望这会有所帮助。

答案 1 :(得分:0)

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

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

在web api 2中,我认为你可以拥有一个全局FilterAttribute来强制执行SSL连接,然后使用新的属性覆盖功能http://dotnet.dzone.com/articles/new-filter-overrides-feature来创建你的异常 - 尽管这些理论都是如此! :)

希望有所帮助    盖瑞特