23

我无法弄清楚如何使用 System.Web.Http.Filters 中的 IAuthorizationFilter 在 Web API 中实现授权过滤器。

这是我编写的一个简单过滤器,用于响应所有非 https 请求,并带有 403 禁止响应:

public class HttpsFilter : IAuthorizationFilter {
    public bool AllowMultiple {
        get {
            return false;
        }
    }

    public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync( HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation ) {
        var request = actionContext.Request;

        if ( request.RequestUri.Scheme != Uri.UriSchemeHttps ) {
            HttpResponseMessage response = request.CreateResponse( HttpStatusCode.Forbidden );
            response.Content = new StringContent( "<h1>HTTPS Required</h1>", Encoding.UTF8, "text/html" );
            actionContext.Response = response;

            return new Task<HttpResponseMessage>( delegate() {
                return response;
            } );
        }
        else
            return continuation();
    }
}

到目前为止我所写的运行,但是当我尝试通过常规 http 访问 api 时,它只是挂起,我从来没有得到响应。

4

2 回答 2

8

对于您的场景,您可以简单地从“System.Web.Http.AuthorizeAttribute”派生。

例子:

public class HttpsFilterAttribute : System.Web.Http.AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        //do something
    }
}
于 2013-04-12T19:19:58.497 回答
6

您要么需要将任务保存到变量中并task.Start()在返回之前调用该方法,要么使用该Task<HttpResponseMessage>.Factory.StartNew(Action action)方法创建任务。

于 2013-04-12T19:10:32.200 回答