2014-07-21 2 views
1

formauthentication으로 webapi 사용 (이상하게 들릴지 모르지만, 내가 필요한 것).리소스 기반 ASP.NET 권한 부여 FormsAuthentication 및 WebApi

나는 같은 경로가 :

[Route("{application}/orders}"] 
public IHttpActionResult Get(string application) { 
    var orders = OrderService.GetOrders(application); // return list of orders of applicaiton. 
    return Ok(orders); 
} 

시나리오 예 : 사용자 요한은 사용자 레이아이 응용 프로그램은 "로빈" 사용자는 트리스탄 아무튼를 주문을 볼 수있는 권한이있다 "CoolApp"응용 프로그램에 대한 주문을 볼 수있는 권한이있다 명령을 볼 수있는 권한이 없습니다.

위에서 DB는 역할 - 리소스 관계와 같습니다. UserRole는 :

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

나는 사용자가 특정 응용 프로그램의 주문을받을 수있는 권한이있는 경우 그 경로를 확인합니다.

나는 이것을 읽었습니다 : Resource based authorization in .net 그리고 유망 해 보입니다.

우선 간단히 여기 http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api 설명 된대로 내가 AuthorizeAttribute, AuthorizationFilterAttribute 또는 IAuthorizationFilter를 사용하여 확장해야하는 경우 나는 불행하게도, 많은 정보이 아닌 모르겠어요입니다.

두 번째로 나는 바인딩이 승인 이후에 발생하므로 경로 데이터에 정의 된 {application}이 (가) 있으므로 액세스 할 수 있어야한다고 생각하므로 RouteData에서 값을 가져 오는 방법을 알지 못합니다. MVC에 대한 몇 가지 예제가 있지만 웹 API 및 actionContext 객체 전체에서 요청 및 컨텍스트와 같은 객체를 가져올 수 없었습니다. 어디서 얻을 수 있는지, 적절한 방법으로 어떻게해야할지 모르겠습니다.

마지막으로 중요한 것은 내가 선택한 우선 적용 점의 어떤 메소드를 오버라이드해야하는지입니다. 비동기 및 동기화가 모두있는 경우 두 가지를 모두 재정의해야합니까?

보너스 : 권한 부여는 내 repository에 대한 의존성을 가지므로 가능한 경우 필터에 삽입하는 방법을 알고있는 것이 좋습니다. (IoC 컨테이너를 사용하고 있지 않습니다.)

답변

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 컨테이너를 사용하려면 DI 웹 API ActionFilter를 사용하고 싶습니다.

관련 문제