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

时间:2014-07-21 23:51:46

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

将webapi与formsauthentication一起使用(我知道这可能听起来很奇怪,但它正是我需要的。)

我的路线如下:

[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无权查看订单。

在DB上就像是角色 - 资源关系。 UserRole的:

User    -      Role     - Application
=====================================
John    - OrdersManager - CoolApp
Leia    - OrdersManager - Robin
Tristan - OtherRole     - Robin

我希望该路由检查用户是否有权获取该特定应用程序的订单。

我读到这个:Resource based authorization in .net看起来很有希望。

首先,我不确定是否应该使用AuthorizeAttributeAuthorizationFilterAttributeIAuthorizationFilter进行扩展,如此处简要说明http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api,不幸的是,信息不多。

其次我读到绑定在授权后发生,所以我不知道如何从RouteData获取值,因为我在路由数据上定义了{application},我想我应该能够访问它。 MVC的例子很少,但是无法获得一个用于web api的对象以及在actionContext对象中的请求和上下文之类的对象我不知道在哪里得到它以及如何以正确的方式。

最后但并非最不重要的是,我应该覆盖所选扩展点的哪种方法。如果它同时具有异步和同步,我应该覆盖它们吗?

BONUS:由于授权将依赖于我的repository,如果可能的话,知道如何将其注入过滤器会很棒。 (我没有使用任何IoC容器。)

1 个答案:

答案 0 :(得分:1)

重写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