我有一個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不同,這怎麼解決?
你在做什麼OnAuthenticate方法? – 2014-08-27 20:30:02
@PeterLillevold我用更多的信息更新了這個問題。有趣的是,如果我不使用Autofac的IAutofacAuthenticationFilter接口並使用'var dependecyScope = actionContext.Request.GetDependencyScope();解析我需要的服務; var lifetimeScope = dependecyScope.GetRequestLifetimeScope(); _service = lifetimeScope.Resolve ()'並用過濾器裝飾Base api控制器,問題就消失了。 –
boosts
2014-08-27 21:44:26