从 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 */
}
我有一个实现 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 */
}