[英]Asp.net Core WebAPI Resource based authorization outside controller level
[英]Resource based ASP.NET Authorization FormsAuthentication and WebApi
使用带有表单身份验证的webapi(我知道这听起来很奇怪,但这正是我所需要的)。
我有一条路线像:
[Route("{application}/orders}"]
public IHttpActionResult Get(string application) {
var orders = OrderService.GetOrders(application); // return list of orders of applicaiton.
return Ok(orders);
}
示例场景:John用户有权查看应用程序“ CoolApp”的订单Leia用户有权查看应用程序“ Robin”的订单,用户Tristan无权查看命令。
在数据库上就像角色-资源关系。 UserRole的:
User - Role - Application
=====================================
John - OrdersManager - CoolApp
Leia - OrdersManager - Robin
Tristan - OtherRole - Robin
我希望该路线检查用户是否有权获取该特定应用程序的订单。
我读到以下内容: .net中基于资源的授权 ,看起来很有希望。
第一件事是我不确定是否应该使用AuthorizeAttribute
, AuthorizationFilterAttribute
或IAuthorizationFilter
扩展, IAuthorizationFilter
简要说明的http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-不幸的是, web-api的信息并不多。
其次,我读到绑定是在授权后发生的,所以我不知道如何从RouteData
获取值,因为我在路由数据上定义了{application},我想我应该可以访问它。 MVC的例子很少,但是无法为Web api获取一个例子,并且在整个actionContext对象上都没有诸如请求和上下文之类的对象,我不确定从何处以及如何正确获取它。
最后但并非最不重要的一点是,我应该覆盖所选扩展点的哪种方法。 如果它既有异步又有同步,是否应该同时覆盖这两个?
奖励:由于授权将依赖于我的repository
,因此,即使有可能,知道如何将其注入过滤器也将是一件很棒的事情。 (我没有使用任何IoC容器)。
覆盖AuthorizationFilterAttribute可能是更好的方法。 您想要做的就是传递要检查的属性:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
string role;
string application
public MyAuthorizeAttribute (string role, string application){
this. role = roles;
this.application = application;
}
protected override bool IsAuthorized(HttpActionContext actionContext) {
var routeData = actionContext.ControllerContext.RouteData;
//do your checks
}
}
您可以通过IsAuthorized方法中的HttpActionContext访问routedata。 现在,您可以将属性附加到ApiController或Action Method。
我建议使用IoC容器是否要使用Web API ActionFilter进行DI
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.