2014-08-27 111 views
0

我有一個Web API授權過濾器,應用於Web API控制器的基礎控制器。授權類型是基本。授權過濾器正在使用IAutofacAuthenticationFilter,並使用一些自動注入服務來執行授權和身份驗證。WebApi授權過濾器

一切正常預計GET請求。 授權標題被讀取和確認,並且如果請求在授權標頭中沒有正確的授權信息,則該請求被響應使用。

public void OnChallenge(HttpAuthenticationChallengeContext context) { 
    var host = context.Request.RequestUri.DnsSafeHost; 
    context.Request.CreateResponse(HttpStatusCode.Unauthorized, "Unauthenticated request"); 
    context.Request.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", host)); 
} 

然而,當一個POST請求時,一切都被稱爲以同樣的方式和上面的方法被作爲所謂的預期,但請求轉到實際控制動作不斷處理。

OnAuthorization沒有被修改或重載。相反,

OnAuthenticate看起來像這樣:

public void OnAuthenticate(HttpAuthenticationContext context) 
    { 


     var identity = ParseAuthorizationHeader(context.ActionContext); // identity is a custom object representing the information in the auth header 
     if (identity == null) { 
      HandleUnauthorizedRequest(context.ActionContext); 
      return; 
     } 


     if (!OnAuthorizeUser(identity.Name, identity.Key, context.ActionContext)) { 
      HandleUnauthorizedRequest(context.ActionContext); 
      return; 
     } 
    } 

這裏是設置本金和認證用戶的自定義方法:

protected virtual bool OnAuthorizeUser(KeyContainer name, string key, HttpActionContext actionContext) { 

     // get principal code ... 

     Thread.CurrentPrincipal = principal; 
     actionContext.RequestContext.Principal = principal; 
     if (HttpContext.Current != null) 
      HttpContext.Current.User = principal; 

     return true; 
    } 

授權濾波器被註冊與所述容器具有以下:

builder.Register(c => 
      new AuthorizeActionFilterAttribute(
       c.Resolve<IService>()) 
      .AsWebApiAuthenticationFilterFor<BaseApiController>() 
      .InstancePerRequest(); 

POST請求中發生了什麼與GET不同,這怎麼解決?

+0

你在做什麼OnAuthenticate方法? – 2014-08-27 20:30:02

+0

@PeterLillevold我用更多的信息更新了這個問題。有趣的是,如果我不使用Autofac的IAutofacAuthenticationFilter接口並使用'var dependecyScope = actionContext.Request.GetDependencyScope();解析我需要的服務; var lifetimeScope = dependecyScope.GetRequestLifetimeScope(); _service = lifetimeScope.Resolve ()'並用過濾器裝飾Base api控制器,問題就消失了。 – boosts 2014-08-27 21:44:26

回答

2

我猜測問題出在過濾器的InstancePerRequest註冊。我們有一個fairly extensive FAQ on per-request scope usage,其中一部分注意到you can't have per-request dependencies in filters,因爲WebAPI在控制器創建後緩存過濾器實例 - 成功完成這項工作的唯一方法(如您發現的)是使用過濾器本身的服務位置。不幸的是,我們無法從Autofac方面做到這一點。 WebAPI中的所有內置和不可覆蓋的行爲都是這樣。

希望他們會改變ASP.NET vNext。

+0

緩存是否會影響GET和POST請求?該問題只發生在發佈請求上。我將檢查常見問題。 – boosts 2014-08-28 23:17:54