2011-05-13 7 views
4

이것은 하늘에 파이 일지 모르지만 사용자 지정 컨트롤러 특성으로 다음 작업을 수행 할 수 있는지 궁금합니다..NET MVC 3 사용자 지정 컨트롤러 특성

내 컨트롤러의 대다수는 "r"이라는 URL 매개 변수를 컨트롤러 내의 각 동작에 전달합니다. "r"은 내 데이터베이스의 경주 테이블에있는 경주 id에 묶여 있습니다.

컨트롤러 동작이 호출 될 때마다 자동으로 "r"의 존재 여부를 확인하고 데이터베이스에 쿼리하여 "r"이 로그인 한 사용자의 것인지 확인하고 설정합니다 ViewBag.RaceId라는 이름의 viewbag 변수는 "r"과 같습니다.

이러한 조건 중 하나라도 충족되지 않으면 다시 로그인 페이지로 리디렉션됩니다.

가능한 한 내 코드를 작성하려고합니다.

모든 안내가 크게 감사하겠습니다.

사용자 정의 Authorize 속성을 쓸 수

답변

6

:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = base.AuthorizeCore(httpContext); 
     if (isAuthorized) 
     { 
      var request = httpContext.Request; 
      // Fetch "r" from the route data or request 
      var r = request.RequestContext.RouteData.Values["r"] 
       ?? request["r"]; 
      var currentUser = httpContext.User.Identity.Name; 
      if (!CheckIfRBelongsToTheCurrentLoggedInUser(currentUser, r)) 
      { 
       return false; 
      } 
     } 
     return isAuthorized; 
    } 
} 

이제 남은 모든이 사용자 지정 특성으로 컨트롤러/액션을 장식하는 것입니다

[MyAuthorize] 
public ActionResult Foo() 
{ 
    //... 
} 

을 그리고 당신은에 뭔가를 넣어 원하는 경우 ViewBag를 사용하면 AuthorizeCore 메서드 내에서 httpContext.Items에 일시적으로 저장할 수 있으며 OnAuthorization 메서드도 무시하고 c 문맥. 존재한다면 filterContext.Controller.ViewBag에 저장할 수 있습니다.

+0

Pure Awesome. ViewBag에 관한 하나의 질문. 내 사용자 지정 특성에 추가 된 : httpContext.Items.Add ("RaceId", r.ToString()); 내 재정의 OnAuthorization에 filterContext.Controller.ViewBag.RaceId = filterContext.HttpContext.Items [ "RaceId"];를 추가했습니다. 그 맞습니까? OnAuthorization 무시. – Mike

+0

신경 쓰지 마세요. 내가 ilterContext.Controller.ViewBag.RaceId = filterContext.HttpContext.Items [ "RaceId"] 전에 base.OnAuthorization (filterContext); 이제 작동합니다! – Mike

+0

'httpContext.Items'을 통해 데이터를 전달하기 위해 Darin의 제안을 사용하는 사람에게 주목하십시오. 'httpContext.Items'을 확인하기 전에'OnAuthorization'이'base.OnAuthorization (filterContext)'를 호출해야합니다. 내가이 일을하기 전까지는 제대로 작동하지 못했습니다. –

관련 문제