自定义授权属性在 WebAPI 中不起作用

Posted

技术标签:

【中文标题】自定义授权属性在 WebAPI 中不起作用【英文标题】:Custom authorization attribute not working in WebAPI 【发布时间】:2014-06-13 21:01:58 【问题描述】:
 public class CustomAuthorizeAttribute : AuthorizationFilterAttribute
   
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    
       return true;// if my current user is authorised
    
 

上面是我的 CustomAuthorizeAttribute 类 和

[CustomAuthorize] // both [CustomAuthorize] and [CustomAuthorizeAttribute ] I tried 
public class ProfileController : ApiController

   //My Code..

当我打电话时

http://localhost:1142/api/Profile 

它没有触发CustomAuthorizeAttribute

我的 FilterConfig 类的更多内容如下所示

public class FilterConfig

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
                
        filters.Add(new CustomAuthorizeAttribute());
    

如果我遗漏了什么,请帮忙。

【问题讨论】:

【参考方案1】:

试试这个。

public class CustomAuthorizeAttribute : AuthorizeAttribute

    protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
    
        return true;
    

【讨论】:

Thankyou .. 但我得到了构建错误,比如没有合适的方法来覆盖(实际上在 AuthorizeAttribute 中没有这样的方法):( 这个属性来自System.Web.Http。如果你使用 System.Web.Mvc 属性,你应该重写 AuthorizeCore 方法! 这是你真正需要的东西。如果用户被授权,只需给出一个布尔值。【参考方案2】:
    看起来您使用的是 MVC 过滤器而不是 Web API 过滤器。可以在样本中检测到它,因为它使用了HttpContextBase。请改用 System.Web.Http.Filters 命名空间中的过滤器。 您需要在 Web API 过滤器上覆盖 OnAuthorization OnAuthorizationAsync。 您无需注册全局过滤器并用它来装饰您的控制器。注册它会使其在所有控制器上运行。

Web API 过滤器代码: https://github.com/aspnetwebstack/aspnetwebstack/blob/master/src/System.Web.Http/Filters/AuthorizationFilterAttribute.cs

【讨论】:

@ChaoticCoder 看起来像链接has been fixed。【参考方案3】:

Y我们的自定义属性应该继承自System.Web.Http.Filters.AuthorizationFilterAttribute

它应该看起来像这样

using System.Web.Http.Controllers;
using System.Web.Http.Filters;
public class CustomAuthorizeAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
   
    public override bool AllowMultiple
    
        get  return false; 
    

    public override void OnAuthorization(HttpActionContext actionContext)
    
        //Perform your logic here
        base.OnAuthorization(actionContext);
    

【讨论】:

【参考方案4】:

为了添加您从 System.Web.Http.Filters.AuthorizationFilterAttribute 继承的其他答案,我将其放入我的 OnAuthorization 方法中以确保用户已登录:

if (!actionContext.RequestContext.Principal.Identity.IsAuthenticated)

     // or whatever sort you want to do to end the execution of the request
     throw new HttpException(403, "Forbidden");
 

【讨论】:

以上是关于自定义授权属性在 WebAPI 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

设置自定义样式属性在 IE11 中不起作用

自定义依赖属性在具有 TemplatedParent 的 UWP 模板中不起作用

自定义自动播放进度条 - 动态宽度属性 - 在铬中不起作用

部署到 IIS 后自定义授权属性不起作用

WebApi 2始终使用自定义JWT令牌返回401授权

安全区域在自定义 TabBarController 的 ViewController 中不起作用