WebApi授权过滤器

问题描述:

我有一个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

我猜测问题出在过滤器的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