2010-04-21 4 views
2

어떻게 호출 방법에 대한 액세스를 거부 할 수 있습니까? 이사용자 지정 역할 거부

[HandleError] 
    [Authorize(Roles = "role1, role2")] 
    public class AdminController : Controller 
    {   


     [Deny(Roles = "role2")] 
     public ActionResult ResultPage(string message) 
     { 
      ViewData["message"] = message; 
      return View(); 
     } 
} 

답변

3

같은 당신은 주위에 그것을 다른 방법을하고 role1의 존재 대신 role2의 부재를 확인 간단하게 할 수있다. 또는 원하는 것을 수행하고 사용자가 지정된 역할에 있지 않음을 확인하는 자체 DenyAttribute를 개발할 수 있습니다.

[HandleError] 
[Authorize(Roles = "role1, role2")] 
public class AdminController : Controller 
{   


    [Authorize(Roles = "role1")] 
    public ActionResult ResultPage(string message) 
    { 
     ViewData["message"] = message; 
     return View(); 
    } 
} 

public class DenyAttribute : AuthorizeAttribute 
{ 

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

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

     if (Users.Length > 0 && Users.Split(',').Any(u => string.Compare(u.Trim(), user.Identity.Name, StringComparer.OrdinalIgnoreCase))) { 
      return false; 
     } 

     if (Roles.Length > 0 && Roles.Split(',').Any(u => user.IsInRole(u.Trim()))) { 
      return false; 
     } 

     return true; 
    } 

} 
+0

정말 개인이 아닌'_usersSplit' 및'_rolesSplit' 변수를 보호하고 싶습니다. 분리를 다시 구현하는 대신 재사용 할 수 있습니다. – tvanfosson

관련 문제