从WebAPI请求中获取路由方法的特定属性

本文关键字:属性 方法 路由 WebAPI 请求 获取 | 更新日期: 2023-09-27 18:15:19

我有一个实现AuthorizableApi类的控制器。

[AttributeUsage(AttributeTargets.Method)]
public class AuthorizableRoute : Attribute { }
public class AuthorizableApi : ApiController
{
    public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
    {
        /* Add functionality here to secure the API */
        return base.ExecuteAsync(controllerContext, cancellationToken);
    }
}

这允许我保护整个控制器,但是我也希望能够保护单个动作。使用controllerContext,我可以获得控制器和路由,但我不知道是否有可能获得该动作的属性。

    [HttpPost]
    [AuthorizableRoute]
    public HttpResponseMessage DataAction([FromBody] DataType data)
    {
        /* Actions */
    }

所以,我希望能够做一些像…

if(Attribute.GetCustomAttribute(myRoute, typeof (AuthorizableRoute)) != null) { }

如果这是不可能的,那么什么是可行的替代方案?

从WebAPI请求中获取路由方法的特定属性

您可以通过实现过滤器来实现这一点。然而,你应该继承AuthorizationFilterAttribute并实现OnAuthorization(HttpActionContext context)方法。应该是这样的:

public class AuthorizableRouteFilterAttribute : AuthorizationFilterAttribute
{
   public override void OnAuthorization(HttpActionContext context)
   {  
      IPrincipal principal = Thread.CurrentPrincipal;            
      /*Your authorization check here*/
      if (!principal.IsInRole("YourRole")) // or whatever check you make
      {
           context.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
           return;
      }
   }        
}

[HttpPost]
[AuthorizableRouteFilter]
public HttpResponseMessage DataAction([FromBody] DataType data)
{
    /* Actions */
}