【问题标题】:Get Specific Attribute on Route Method from WebAPI Request从 WebAPI 请求中获取路由方法的特定属性
【发布时间】:2015-09-29 14:02:53
【问题描述】:

我有一个实现 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) { }

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

【问题讨论】:

    标签: c# asp.net-web-api asp.net-web-api2 asp.net-web-api-routing


    【解决方案1】:

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

    【讨论】:

    • 我发现并最终使用了 AuthorizeAttribute,但经过一些快速研究后,看起来 AuthorizationFilterAttribute 是更好的选择。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多