2013-02-28 4 views
1

나는 최근에 this question에게 물어보고 성공적으로 내 사용자 지정 권한 부여 특성을 설정했습니다.사용자 지정 액션 및 API 호출 모두에 대한 권한 부여?

하지만 이제는 API 호출과 관련하여 다른 벽을 공격했습니다. 액션 호출과 동일한 방식으로 권한이 부여되도록이 호출이 필요합니다. System.Web.Http와 System.Web.Mvc Authorize 특성 간에는 차이점이 있음을 이해합니다. 그래서 나는 기본적으로 동일한 것을하는 별도의 API 특성을 만들었습니다. 그러나 원래 속성에서와 같이 User - principal 및 ID를 설정하는 데 문제가 있습니다.

내 특성은 사용자 지정 주체/ID 설정 내에 해독 된 쿠키 정보를 저장하고있는 쿠키를 특성이 읽은 후에 쿠키의 일부 값만 확인하여 요청을 승인합니다. 내 API 호출에서 ID가이 정보를 검색 할 때 캐스트가 실패하고 null 값을받습니다.

내가 정보를 저장하는 방법입니다

API 광고

HttpContext.Current.User = new MyPrinciple(new MyIdentity(decCookie.Name, decCookie.UserData)); 

액션

filterContext.RequestContext.HttpContext.User = new MyPrinciple(new MyIdentity(decCookie.Name, decCookie.UserData)); 

나는 검색 내가 가정 원하는 정보가 될 것이다 어떻게 같은

(User.principal.Identity as MyIdentity).MyData; 

질문

  1. 정말이 별도의 속성 API에 대한
  2. 내가 쉽게 컨트롤러 내에서 나중에 사용하기 위해 정보를 저장할 수있는 방법 속성을해야합니까. 아니면 기본적으로 이러한 호출에 대해 ID를 얻거나 설정하지 못합니까?

편집 # 1 내가 제대로 내 ApiController에서 내 쿠키 값에 액세스하는 방법을 발견

, 단순히 System.Web> _ <에 대한 참조를 누락되었습니다. 그래서 질문 # 2가 해결되었습니다! 그러나 # 1은 여전히 ​​남아 있습니다.

답변

1

C#에서 하나의 클래스에서만 상속 가능하며 각 authorize 속성은 고유 한 네임 스페이스에 있으므로 하나의 클래스에서 수행 할 수 없습니다.

공용 네임 스페이스에 넣은 다음 일반 클래스를 호출하여 들어 올릴 수 있습니다. 난 당신이 System.Threading.Thread.CurrentPrincipal를 설정 참조

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Security; 

namespace Common.Attributes 
{ 
public class CustomAuthorize : System.Web.Mvc.AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (!HttpContext.Current.Request.IsAuthenticated || (HttpContext.Current.User as User) != null) 
      return; 

     filterContext.HttpContext.User = Authorize.ExtractIdentity(filterContext.HttpContext); 
    } 
} 

public class CustomHttpAuthorize : System.Web.Http.AuthorizeAttribute 
{ 
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     base.OnAuthorization(actionContext); 

     if (!HttpContext.Current.Request.IsAuthenticated || (HttpContext.Current.User as User) != null) 
      return; 

      System.Threading.Thread.CurrentPrincipal = Authorize.ExtractIdentity(filterContext.HttpContext); 
     } 
    } 
} 

public static class Authorize 
{ 
    public static IIdentity ExtractIdentity(HttpContext context) 
    { 
     // do your magic here 
    } 
} 
} 
+0

... 방법이 HttpContext.Current.User 다릅니 까 (안된)

가능한 해결 방법? – Zholen

+0

나는 그것을 보지 못했다. tbh, 나는 API 콘트롤러의 User 객체가 httpcontext.user와 다르다는 것을 발견했다. 그래서 나는 대신 스레드 주체에 넣었고, 동작하는 것처럼 보였다. – Slicksim

3

웹 API와 MVC는 동일하게 보더라도 (기술적으로) 공통점이 없습니다. 두 가지 속성이 필요합니다.

관련 문제