2011-12-20 5 views
8

MVC에서 [Authorize] 속성을 사용하기 위해 읽은 적이 있습니다. 작업을 수행하거나 보안하려는 컨트롤러 클래스 위에 배치하면됩니다.MVC3에서 권한 부여 방법을 사용하는 방법

내 질문은 : Authorize 사용자가 로그인했는지 여부를 어떻게 알 수 있습니까? 사용자가 승인 된 경우 Authorize을 알리려면 세션 객체를 제공해야합니까?

답변

15

이 특성은 HttpContext.User.Identity.IsAuthenticated을보고 작동합니다.

FormsAuthentication과 같은 것을 사용하는 경우 사용자가 컴퓨터에 유효한 FormsAuthentication 쿠키 (FormsAuthentication.SetAuthCookie을 사용하여 추가 할 수 있음)가 있으면이 값이 true로 설정됩니다. 당신이 Authorize의 내부 - 동작에 관심이 있다면

이 게시 된 마이크로 소프트의 소스 코드입니다 : 여기

protected virtual bool AuthorizeCore(HttpContextBase httpContext) { 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 

     IPrincipal user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) { 
      return false; 
     } 

     if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) { 
      return false; 
     } 

     if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) { 
      return false; 
     } 

     return true; 
    } 

some more info on FormsAuthentication입니다.

+0

고마워요. 훌륭한 자원! – Jose3d

2

권한 부여 클래스는 기본적으로 httpcontext를 인수로 사용합니다. 호출 될 때. 그런 다음 HttpContext.User.Identity.IsAuthenticated bool 값을 확인하고 그에 따라 작동합니다. 폼 인증을 사용하는 경우에만 작동합니다. 예를 들어 세션 객체에서 고유 한 로그인 논리를 사용하는 경우 Authorize Attribute에서 클래스를 파생시키고 호출 할 수 있습니다.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true,  AllowMultiple = true)] 
public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     clsSession sess = httpContext.Session["Current"] as clsSession; 
     if (sess.IsLogin) return true; 
     return false; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult { ViewName = "Unauthorized" }; 
    } 
} 

그럼 당신은 이런 식으로이 클래스를 사용할 수 있습니다 :이 작동

[MyAuthorize] 
public ActionResult Index() 
{ 
    return View(); 
} 

. 모든 컨트롤러 동작에서 [인증] 대신 [MyAuthorize]를 사용할 수 있습니다. false를 반환하면 뷰가 반환됩니다 (이 경우 "Unauthorized"). 보기 이름은 무엇이든 가능하며보기/공유 폴더에 위치 할 수 있습니다.