从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) { }
如果这是不可能的,那么什么是可行的替代方案?
您可以通过实现过滤器来实现这一点。然而,你应该继承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 */
}