繁体   English   中英

基于资源的ASP.NET授权FormsAuthentication和WebApi

[英]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中基于资源的授权 ,看起来很有希望。

第一件事是我不确定是否应该使用AuthorizeAttributeAuthorizationFilterAttributeIAuthorizationFilter扩展, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM