2015-01-16 3 views
0

저는 새로운 ASP.NET 개발자입니다. 지금은 응용 프로그램의 사용자 역할 메커니즘을 연구하고 있습니다. 특정 그룹에 속한 사람들 만 응용 프로그램에 액세스 할 수 있습니다 ( ). 그런 다음 시스템은 각 사용자의 역할을 확인해야합니다. 일부 메뉴 옵션은 역할에 따라 으로 숨겨집니다. 사용자가 시스템에 액세스 할 수없는 그룹에 속한 경우 사용자는 '액세스 거부'페이지로 리디렉션되어야합니다. '액세스 거부'페이지를 포함한 모든 페이지는 마스터 페이지를 사용하여 동일한 모양과 느낌을 갖습니다.이 asp.net 응용 프로그램의 마스터 페이지에서 사용자 액세스 검사를 수정하는 방법은 무엇입니까?

ASP.NET 메뉴 컨트롤을 사용하면서 사용자 역할에 따라 메뉴 항목 옵션을 숨기는 방법을 작성했습니다. 그러나 나는 여전히 시스템에 액세스 할 수없는 그룹에 속한 사용자를 '액세스가 거부 됨'페이지로 리디렉션하는 데 어려움을 겪고있는 입니다. 내 다음 코드를 디버깅 할 때 액세스를 확인하고 메뉴 항목을 설정하는 무한 루프를 통해 디버거를 사용할 때.

어떻게하면이 문제를 해결할 수 있습니까? MasterPage.master의

코드 숨김 :

protected void Page_Init(object sender, EventArgs e) 
    { 
     MenuAccess(); 
    } 


    protected void MenuAccess() 
    { 
     if (HasAccess()) 
     { 
      if (!Helper.IsAdmin(username)) 
      { 
       MenuItemCollection menuItems = NavigationMenu.Items; 
       RemoveMenuItemByValue(menuItems, "movies"); 
      } 
      if (!Helper.IsSupport(username)) 
      { 
       MenuItemCollection menuItems = NavigationMenu.Items; 
       RemoveMenuItemByValue(menuItems, "music"); 
      } 
     } 
     else 
     { 
      Response.Redirect("~/Pages/Error/AccessDenied.aspx"); 
      return; 
     } 
    } 

    protected bool HasAccess() 
    { 
     bool hasAccess = false; 
     //General access to the system by the group code 
     if (Helper.HasAccess(orgCode)) 
     { 
      hasAccess = true; 
     } 
     return hasAccess; 
    } 


    public static void RemoveMenuItemByValue(MenuItemCollection items, String value) 
    { 
     MenuItem itemToRemove = null; 

     //Breadth first, look in the collection 
     foreach (MenuItem item in items) 
     { 
      if (item.Value == value) 
      { 
       itemToRemove = item; 
       break; 
      } 
     } 

     if (itemToRemove != null) 
     { 
      items.Remove(itemToRemove); 
      return; 
     } 

     //Search children 
     foreach (MenuItem item in items) 
     { 
      RemoveMenuItemByValue(item.ChildItems, value); 
     } 
    } 

답변

0

당신이를 포함한 모든 페이지에 '액세스 거부'

참고 MasterPage에서 때문에 수표는 않기 때문에 페이지 MasterPage를 사용하여 동일한 모양과 느낌을 얻습니다.

그런 다음 "액세스가 거부되었습니다"로 리디렉션하면 권한이 있는지 다시 확인합니다.

그래서 "AccessDenied"에 대한 모든 권한을 부여하거나 페이지가 맞는지 확인하지 않는 특별 if 조건을 추가하십시오.

또는 "AccessDenied"에 대해 마스터 페이지를 사용할 수 없습니다. 코드에서 예를 들어

, ...

protected void Page_Init(object sender, EventArgs e) 
{ 
    //If this page is not AccessDenied.aspx 
    if(Request.Path != "~/Pages/Error/AccessDenied.aspx") 
    { 
     MenuAccess(); 
    } 
} 
+0

당신이 코드로 이것을 설명시겠습니까? –

+0

@TechnologyLover 아마 제공되는 코드 스 니펫이 작동하지 않지만 비슷한 것을 할 것입니다 ... – hatcyl

+0

저는 아직 새로운 개발자로서 생각을하지 못했습니다. 제 코드에서 저를 도울 수 있습니까? –