2016-11-29 3 views
2

사용자가 주어진 리소스에 대한 액세스 권한이 있는지 여부를 확인하는 사용자 지정 AuthorizeAttribute를 만들었습니다. 그것은 일반적인하기 위해, 나는 속성에 전달 된 두 개의 변수가 필요합니다route 매개 변수를 사용자 지정 특성에 전달

  1. 요청 된 리소스 유형
  2. 요청 된 리소스 ID를
  3. 내가 쉽게 자원 유형이 요청 된 속성을 알 수

, 요청 된 ID를 속성에 전달하는 방법은 무엇입니까?

[System.Web.Http.Authorize] 
[System.Web.Http.RoutePrefix("api/accounts")] 
public class AccountController : ApiController 
{ 
    [AuthorizeIsOwnResource(ResourcesType = ResourcesTypes.Account, ResourceId = ?)] 
    [System.Web.Http.HttpGet] 
    [System.Web.Http.Route("test/{id}")] 
    public ActionResult Test(string id) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.OK); 
    } 
} 

어떤 제안 : 여기 내 코드의 (a ? 표시)없는 마지막 변수이다? 나는 함께 속성 매개 변수를 모두 제거 할 수 있고 AuthorizeCore에있는 HttpContextBase에서 요청 된 자원 유형과 ID를 암호 해독 할 수 있다고 생각합니다. 하지만 내 유일한 선택인가?

+0

actionContext.ControllerContext.RequestContext.RouteData;에서 요청 ID를 얻을. 가장 좋은 솔루션은 HttpContextBase에서 컨트롤러 및 액션 이름에 액세스하는 것입니다. 더 깔끔하고 구현하기 쉽고 오류 발생 가능성이 적습니다. –

+0

문제에 대해 조금 숙고 한 후, 나는 당신이 절대적으로 옳다고 생각합니다. HttpContextBase에서 RouteData를 추출 할 수도 있습니다. 나는 그것을 테스트 한 후에 해결책을 게시 할 것이다. – MichaelCleverly

답변

2

좋아. 더글러스 간디니 (Douglas Gandini)의 의견을 바탕으로, 가장 좋은 방법은 속성을 요청하여 어떤 ID가 요청되었는지를 결정하는 것입니다. 즉

public class AuthorizeIsOwnResourceAttribute : AuthorizeAttribute 
{ 
    public ResourcesTypes ResourcesType { get; set; } 

    protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     var httpContext = HttpContext.Current; 
     var claimsIdentity = httpContext.User.Identity as ClaimsIdentity; 
     var routeData = actionContext.ControllerContext.RequestContext.RouteData; 

     switch (ResourcesType) 
     { 
      case ResourcesTypes.Account: 
       return AuthorizeAccount(routeData, claimsIdentity); 
     } 

     return false; 
    } 

    private bool AuthorizeAccount(IHttpRouteData routedata, ClaimsIdentity claimsIdentity) 
    { 

     var id = routedata.Values["id"].ToString(); 
     var accountClaim = claimsIdentity.Claims.FirstOrDefault(x => x.Type == "Resource-" + ResourcesTypes.Account); 
     if (accountClaim == null || accountClaim.Value != id) 
     { 
      return false; 
     } 

     return true; 
    } 
} 

: 여기 내 작업 사용자 정의 속성입니다 난 당신이 대답을 직접 내 특성

0

당신은 당신의 AuthorizationContext의 코드에서 ActionDescriptor을 무시할 수 :

// Summary: 
    //  Initializes a new instance of the System.Web.Mvc.AuthorizationContext class using 
    //  the specified controller context and action descriptor. 
    // 
    // Parameters: 
    // controllerContext: 
    //  The context in which the result is executed. The context information includes 
    //  the controller, HTTP content, request context, and route data. 
    // 
    // actionDescriptor: 
    //  An object that provides information about an action method, such as its name, 
    //  controller, parameters, attributes, and filters. 
    public AuthorizationContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor); 


    // Summary: 
    //  Provides information about the action method that is marked by the System.Web.Mvc.AuthorizeAttribute 
    //  attribute, such as its name, controller, parameters, attributes, and filters. 
    // 
    // Returns: 
    //  The action descriptor for the action method that is marked by the System.Web.Mvc.AuthorizeAttribute 
    //  attribute. 
    public virtual ActionDescriptor ActionDescriptor { get; set; } 
    // 
    // Summary: 
    //  Gets or sets the result that is returned by an action method. 
    // 
    // Returns: 
    //  The result that is returned by an action method. 
    public ActionResult Result { get; set; } 
관련 문제