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

Get Specific Attribute on Route Method from WebAPI Request

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

[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) { }

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

您可以通过实施过滤器来做到这一点。但是,您应该继承 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 */
}