c# - web api 2.0过滤器实现customFilter的最佳选择

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

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

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

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

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

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

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

提前致谢

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

最佳答案

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

关于c# - web api 2.0过滤器实现customFilter的最佳选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44777162/

相关文章:

c# - 将 ListView 绑定(bind)到 ObservableCollection 和 Linq

c# - 默认(可空(类型))与默认(类型)

http - 使用 HTTP 的 WCF 自定义用户名身份验证

javascript - 附加到URL的"undefined"和"cache/xxx"

asp.net-mvc - mvc 4 web api 添加自定义响应 http header

c# - 在 C# 中模拟局部变量

c# - exePath 是 ConfigurationManager.OpenExeConfiguration 中的无效异常

http - 是否可以让浏览器缓存 OPTIONS 结果

c# - StatusCodeResult 或 ResponseMessageResult

c# - 在 Controller ApiController 上未找到任何操作