【问题标题】:Best choice for web api 2.0 filter to implement customFilterweb api 2.0过滤器实现customFilter的最佳选择
【发布时间】:2017-11-30 07:45:34
【问题描述】:

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

我想创建一个自定义过滤器(我猜是自动化过滤器)以仅授权来自允许的引用者(我定义)的发布/放置请求并阻止所有其他请求。

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

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

如果您还可以向我解释让我选择使用这种类型的过滤器而不是其他过滤器的主要区别是什么......

我在 google 中搜索过,但我发现的只是详细的非常大的实现,但我仍然看不出最流行(使用)类型的过滤器与我们选择的原因之间的区别。

提前致谢

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用自定义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());
    

    【讨论】:

    • 如果它不在推荐人列表中,你会阻止任何呼叫,无论它是 Put/Post 吗?
    • else 部分处理它。如果不在推荐人列表中(发布或拨打电话),它将发送未经授权的响应
    • 最后一个问题,我该如何使用这个 RequestFilterHandler ?并对所有发布的帖子请求进行概括?
    • 只需在你的 webapi 项目中添加这个类。正如我所说,这是一个委托处理程序,每个请求都会首先命中 SendAsync 方法。基于 IsAuthorizedPostOrPutCall() 中编写的逻辑,它将通过将请求路由到适当的 WebApiController 来进一步处理请求或返回未经授权的响应
    • 在 webApi 配置中没有什么要添加的吗?只需添加类,处理程序就可以完成工作?
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2011-03-16
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多