2013-04-12 69 views
17

我無法弄清楚如何在Web API中使用來自System.Web.Http.Filters的IAuthorizationFilter實現授權過濾器。在Web API中正確實現IAuthorizationFilter

這是一個簡單的過濾器我寫信給所有非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(); 
    } 
} 

我所寫的,到目前爲止運行,但是當我嘗試過定期訪問API http,它只是掛起,我從來沒有得到迴應。

+0

http://aspnet.codeplex.com/sourcecontrol/latest#Samples/WebApi/BasicAuthentication/ReadMe.txt – Ali

回答

4

您可能需要將任務保存到變量中並在返回之前調用task.Start()方法,或使用Task<HttpResponseMessage>.Factory.StartNew(Action action)方法創建任務。

+12

在該(準異步)的情況下,如何'返回任務.FromResult (response);' –

7

對於您的情況,您可以簡單地從「System.Web.Http.AuthorizeAttribute」派生。

實施例:

public class HttpsFilterAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     //do something 
    } 
} 
+1

我原本是這樣做的,可能會最終堅持它(因爲它更簡單,更易於理解)。我只是試圖實現純粹的界面,以瞭解該類內幕下發生的事情。 –

+2

基蘭是對的。從AuthorizeAttribute派生 - 除了自定義authZ邏輯之外還有更多的事情(例如支持AllowAnonymous)。如果你想知道它是如何工作的,請使用反射器。 – leastprivilege

+7

有些原因會導致你想使用接口而不是'AuthorizeAttribute'。 'AuthorizeAttribute'很好,因爲它爲你處理了很多東西,並公開了一些便利的方法,使得過程更簡單,但它也將Attribute與Filter結合在一起。這使得不可能將依賴注入到過濾器構造函數中。此外,您的過濾器不能使用泛型。所有這些都是通過分解過濾器和屬性的問題來解決的。當然,這一切都假設你的過濾器意味着補充或完全無關,而不是補充AuthorizeAttribute。 – crush