web api 2.0过滤器的最佳选择,以实现customFilter

时间:2017-06-27 09:47:26

标签: c# http asp.net-web-api http-headers

我在应用程序的服务器端使用web api 2.0c#

我想创建一个自定义过滤器(我认为是自动过滤器),仅授权来自允许的引荐者(我定义的)的post / put请求并阻止所有其他请求。

编辑:解释更多:我需要一个好的方法来查看我预先定义允许请求的引用列表中是否存在Request.Header.Referrer,否则我会对其进行授权并且不授权执行方法

我使用AuthorizationFilter吗?为什么?如何?或者我需要其他类型的过滤器,如OperationFilter或其他?

如果你可以向我解释一下,让我选择使用这种过滤器而不是另一种过滤器的主要区别...

我在谷歌中搜索了这个,但我发现的是详细的非常大的实现,但我仍然没有看到最流行(使用)类型的过滤器之间的区别以及我们选择的原因。

提前致谢

编辑:我试图实现CORS,但问题是CORS没有像post中提到的那样集团请求......并且给出的解决方案对于像我这样的简单需求来说太多了

1 个答案:

答案 0 :(得分:2)

您可以使用自定义HttpHandlers来处理识别传入请求的类型。您可以从System.Net.Http.DelegatingHandler派生并覆盖SendAsync方法,如下所示

public class RequestFilterHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        Task<HttpResponseMessage> responseTask;
        if (IsAuthorizedPostOrPutCall(request))
        {
           responseTask = base.SendAsync(request, cancellationToken).ContinueWith(task => task.Result);
        }
        else
        {                        
            responseTask = new Task<HttpResponseMessage>(() => new HttpResponseMessage(HttpStatusCode.Unauthorized));
            responseTask.Start()
        }
      return reponseTask;
    }
    private bool IsAuthorizedPostOrPutCall(HttpRequestMessage request)
    {
      var referrerList = //Assumption:Predefined list you get through a service 
      return referrerList.Contains(request.Headers.Referrer) && ( request.Method == HttpMethod.Post || request.Method == HttpMethod.Put);
    }
}

在Global.asax.cs中:

 GlobalConfiguration.Configuration.MessageHandlers.Add(new RequestFilterHandler());