역할 만들기 및 관리(VB)

작성자 : Scott Mitchell

참고

이 문서가 작성된 이후 ASP.NET 멤버 자격 공급자는 ASP.NET ID로 대체되었습니다. 이 문서를 작성할 때 추천하는 멤버 자격 공급자가 아닌 ASP.NET ID 플랫폼을 사용하도록 앱을 업데이트하는 것이 좋습니다. ASP.NET ID는 를 포함하여 ASP.NET 멤버 자격 시스템에 비해 여러 가지 이점이 있습니다.

  • 성능 향상
  • 향상된 확장성 및 테스트 용이성
  • OAuth, OpenID Connect 및 2단계 인증 지원
  • 클레임 기반 ID 지원
  • ASP.Net Core와의 상호 운용성 향상

코드 다운로드 또는 PDF 다운로드

이 자습서에서는 역할 프레임워크를 구성하는 데 필요한 단계를 살펴봅니다. 그런 다음 역할을 만들고 삭제하는 웹 페이지를 빌드합니다.

소개

사용자 기반 권한 부여 자습서에서는 URL 권한 부여를 사용하여 특정 사용자를 페이지 집합에서 제한하는 방법을 살펴보았습니다. 방문 사용자에 따라 ASP.NET 페이지의 기능을 조정하기 위한 선언적 및 프로그래밍 기술을 살펴보았습니다. 그러나 사용자 단위로 페이지 액세스 또는 기능에 대한 권한을 부여하는 것은 사용자 계정이 많거나 사용자의 권한이 자주 변경되는 시나리오에서 유지 관리 악몽이 될 수 있습니다. 사용자가 특정 작업을 수행하기 위해 권한 부여를 얻거나 잃을 때마다 관리자는 적절한 URL 권한 부여 규칙, 선언적 태그 및 코드를 업데이트해야 합니다.

일반적으로 사용자를 그룹 또는 역할로 분류한 다음 역할 별로 권한을 적용하는 데 도움이 됩니다. 예를 들어 대부분의 웹 애플리케이션에는 관리자용으로만 예약된 특정 페이지 또는 작업 집합이 있습니다. 사용자 기반 권한 부여 자습서에서 학습한 기술을 사용하여 지정된 사용자 계정이 관리 작업을 수행할 수 있도록 적절한 URL 권한 부여 규칙, 선언적 태그 및 코드를 추가합니다. 그러나 새 관리자가 추가되었거나 기존 관리자가 관리 권한을 취소해야 하는 경우 구성 파일 및 웹 페이지를 반환하고 업데이트해야 합니다. 그러나 역할을 사용하면 Administrators라는 역할을 만들고 신뢰할 수 있는 사용자를 관리자 역할에 할당할 수 있습니다. 다음으로, 관리자 역할이 다양한 관리 작업을 수행할 수 있도록 적절한 URL 권한 부여 규칙, 선언적 태그 및 코드를 추가합니다. 이 인프라를 사용하면 사이트에 새 관리자를 추가하거나 기존 관리자를 제거하는 것은 관리자 역할에서 사용자를 포함하거나 제거하는 것만큼 간단합니다. 구성, 선언적 태그 또는 코드 변경이 필요하지 않습니다.

ASP.NET 역할을 정의하고 사용자 계정과 연결하기 위한 역할 프레임워크를 제공합니다. 역할 프레임워크를 사용하여 역할을 만들고 삭제하고, 역할에 사용자를 추가하거나, 역할에서 사용자를 추가하고, 특정 역할에 속한 사용자 집합을 결정하고, 사용자가 특정 역할에 속하는지 여부를 알 수 있습니다. 역할 프레임워크가 구성되면 URL 권한 부여 규칙을 통해 역할별로 페이지에 대한 액세스를 제한하고 현재 로그온한 사용자 역할에 따라 페이지에 추가 정보 또는 기능을 표시하거나 숨길 수 있습니다.

이 자습서에서는 역할 프레임워크를 구성하는 데 필요한 단계를 살펴봅니다. 그런 다음 역할을 만들고 삭제하는 웹 페이지를 빌드합니다. 사용자에게 역할 할당 자습서에서는 역할에서 사용자를 추가하고 제거하는 방법을 살펴봅니다. 또한 역할 기반 권한 부여 자습서에서는 방문 중인 사용자의 역할에 따라 페이지 기능을 조정하는 방법과 함께 역할별로 페이지에 대한 액세스를 제한하는 방법을 알아봅니다. 그럼 시작하겠습니다.

1단계: 새 ASP.NET 페이지 추가

이 자습서와 다음 두 가지에서는 다양한 역할 관련 함수 및 기능을 살펴보겠습니다. 이러한 자습서 전체에서 검토된 topics 구현하려면 일련의 ASP.NET 페이지가 필요합니다. 이러한 페이지를 만들고 사이트 맵을 업데이트해 보겠습니다.

먼저 라는 Roles프로젝트에 새 폴더를 만듭니다. 그런 다음 폴더에 새 ASP.NET 페이지 4개를 Roles 추가하여 각 페이지를 master 페이지와 Site.master 연결합니다. 페이지 이름을 지정합니다.

  • ManageRoles.aspx
  • UsersAndRoles.aspx
  • CreateUserWizardWithRoles.aspx
  • RoleBasedAuthorization.aspx

이 시점에서 프로젝트의 솔루션 탐색기 그림 1에 표시된 스크린샷과 유사하게 표시됩니다.

역할 폴더에 4개의 새 페이지가 추가되었습니다.

그림 1: 폴더에 4개의 새 페이지가 Roles 추가되었습니다(전체 크기 이미지를 보려면 클릭).

이 시점에서 각 페이지에는 master 페이지의 ContentPlaceHolders MainContentLoginContent각각에 대해 하나씩 및 의 두 콘텐츠 컨트롤이 있어야 합니다.

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent" Runat="Server"> 
</asp:Content>

LoginContent ContentPlaceHolder의 기본 태그는 사용자가 인증되었는지 여부에 따라 사이트에 로그온하거나 로그오프할 수 있는 링크를 표시합니다. Content2 그러나 ASP.NET 페이지에 콘텐츠 컨트롤이 있으면 master 페이지의 기본 태그가 재정의됩니다. 양식 인증 개요 자습서에서 설명한 대로 기본 태그를 재정의하는 것은 왼쪽 열에 로그인 관련 옵션을 표시하지 않으려는 페이지에서 유용합니다.

그러나 이 네 페이지의 경우 ContentPlaceHolder에 대한 master 페이지의 기본 태그를 LoginContent 표시하려고 합니다. 따라서 콘텐츠 컨트롤에 대한 선언적 태그를 Content2 제거합니다. 이렇게 하면 네 페이지의 태그 각각에 하나의 콘텐츠 컨트롤만 포함되어야 합니다.

마지막으로 이러한 새 웹 페이지를 포함하도록 사이트 맵(Web.sitemap)을 업데이트해 보겠습니다. 멤버 자격 자습서에 대해 추가한 <siteMapNode> 다음에 다음 XML을 추가합니다.

<siteMapNode title="Roles"> 
 <siteMapNode url="~/Roles/ManageRoles.aspx" title="Manage Roles" />
 <siteMapNode url="~/Roles/UsersAndRoles.aspx" title="Users and Roles" />
 <siteMapNode url="~/Roles/CreateUserWizardWithRoles.aspx" title="Create Account (with Roles)"/>
 <siteMapNode url="~/Roles/RoleBasedAuthorization.aspx" title="Role-Based Authorization" />
</siteMapNode>

사이트 맵이 업데이트되면 브라우저를 통해 사이트를 방문합니다. 그림 2에서 볼 수 있듯이 왼쪽 탐색에는 이제 역할 자습서에 대한 항목이 포함됩니다.

이제 왼쪽 탐색에 역할 자습서에 대한 항목이 포함됩니다.

그림 2: 폴더에 4개의 새 페이지가 Roles 추가되었습니다(전체 크기 이미지를 보려면 클릭).

2단계: 역할 프레임워크 공급자 지정 및 구성

멤버 자격 프레임워크와 마찬가지로 역할 프레임워크는 공급자 모델 위에 빌드됩니다. 보안 기본 사항 및 ASP.NET 지원 자습서에서 설명한 대로 .NET Framework 세 가지 기본 제공 역할 공급자AuthorizationStoreRoleProvider인 , WindowsTokenRoleProvider및 와 SqlRoleProvider함께 제공됩니다. 이 자습서 시리즈에서는 SqlRoleProviderMicrosoft SQL Server 데이터베이스를 역할 저장소로 사용하는 에 중점을 둡니다.

아래에는 역할 프레임워크가 포함되며 멤버 자격 프레임워크 및 SqlRoleProviderSqlMembershipProvider마찬가지로 작동합니다. .NET Framework 역할 프레임워크에 Roles 대한 API 역할을 하는 클래스를 포함합니다. 클래스에는 Roles , , , DeleteRoleIsUserInRoleAddUserToRoleGetAllRoles, 등과 같은 CreateRole공유 메서드가 있습니다. 이러한 메서드 중 하나가 호출되면 클래스는 Roles 구성된 공급자에 대한 호출을 위임합니다. 는 SqlRoleProvider 응답에서 역할별 테이블(aspnet_Roles 및 )과 aspnet_UsersInRoles함께 작동합니다.

애플리케이션에서 공급자를 SqlRoleProvider 사용하려면 저장소로 사용할 데이터베이스를 지정해야 합니다. 에는 SqlRoleProvider 지정된 역할 저장소에 특정 데이터베이스 테이블, 뷰 및 저장 프로시저가 있어야 합니다. 이러한 필수 데이터베이스 개체는 도구를 사용하여 aspnet_regsql.exe추가할 수 있습니다. 이 시점에서 에 필요한 스키마가 있는 데이터베이스가 이미 있습니다 SqlRoleProvider. SQL Server 멤버 자격 스키마 만들기 자습서에서 라는 SecurityTutorials.mdf 데이터베이스를 만들고 에 필요한 SqlRoleProvider데이터베이스 개체를 포함하는 애플리케이션 서비스를 추가하는 데 사용 aspnet_regsql.exe 했습니다. 따라서 역할 지원을 사용하도록 설정하고 데이터베이스와 함께 를 역할 저장소로 사용하도록 SqlRoleProvider 역할 프레임워크에 SecurityTutorials.mdf 지시하기만 하면 됩니다.

Roles 프레임워크는 애플리케이션 파일의 Web.config 요소를 통해 <roleManager> 구성됩니다. 기본적으로 역할 지원은 사용하지 않도록 설정됩니다. 이를 사용하도록 설정하려면 요소의 enabled 특성을 true 다음과 같이 설정 <roleManager> 해야 합니다.

<?xml version="1.0"?>
<configuration>
 <system.web>
 ... Additional configuration markup removed for brevity ... 

 <roleManager enabled="true" />
 <system.web>
</configuration>

기본적으로 모든 웹 애플리케이션에는 형식SqlRoleProvider의 역할 공급자가 있습니다AspNetSqlRoleProvider. 이 기본 공급자는 에 machine.config 등록됩니다(에 %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG있음).

<roleManager>
 <providers>
 <add name="AspNetSqlRoleProvider"
 connectionStringName="LocalSqlServer"
 applicationName="/"
 type="System.Web.Security.SqlRoleProvider,
 System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
 </providers>
</roleManager>

공급자의 connectionStringName 특성은 사용되는 역할 저장소를 지정합니다. 공급자는 AspNetSqlRoleProvider 이 특성을 로 설정합니다. 이 특성LocalSqlServer은 에 machine.config 정의되어 있으며 기본적으로 라는 aspnet.mdf폴더의 SQL Server 2005 Express Edition 데이터베이스를 App_Data 가리킵니다.

따라서 애플리케이션의 파일에 공급자 정보를 지정하지 않고 역할 프레임워크를 사용하도록 설정하는 경우 애플리케이션 Web.config 은 기본 등록된 역할 공급자 를 AspNetSqlRoleProvider사용합니다. 데이터베이스가 ~/App_Data/aspnet.mdf 없으면 ASP.NET 런타임에서 자동으로 데이터베이스를 만들고 애플리케이션 서비스 스키마를 추가합니다. 그러나 데이터베이스를 사용하지 aspnet.mdf 않고, 애플리케이션 서비스 스키마를 이미 만들고 추가한 데이터베이스를 사용 SecurityTutorials.mdf 하려고 합니다. 이 수정은 다음 두 가지 방법 중 하나로 수행할 수 있습니다.

파일에 다음 역할 구성 태그를 추가합니다 Web.config . 이 태그는 라는 새 공급자를 등록합니다. SecurityTutorialsSqlRoleProvider.

<?xml version="1.0"?>
<configuration>
 <connectionStrings>
 <add name="SecurityTutorialsConnectionString"
 connectionString="..."/>
 </connectionStrings>

 <system.web>
 ... Additional configuration markup removed for brevity ...

 &nbsp &nbsp<roleManager enabled="true" defaultProvider="SecurityTutorialsSqlRoleProvider">
 &nbsp &nbsp &nbsp<providers>
 <add name="SecurityTutorialsSqlRoleProvider"
 type="System.Web.Security.SqlRoleProvider"
 applicationName="SecurityTutorials"
 connectionStringName="SecurityTutorialsConnectionString"/>
 </providers>
 </roleManager>
 <system.web>
</configuration>

위의 태그는 를 기본 공급자로 정의합니다 SecurityTutorialsSqlRoleProvider (요소의 defaultProvider 특성을 <roleManager> 통해). 또한 의 applicationName 설정을 SecurityTutorials멤버 자격 공급자()에서 사용하는 것과 동일한 applicationName 설정인 로SecurityTutorialsSqlMembershipProvider 설정합니다SecurityTutorialsSqlRoleProvider. 여기에 <add> 표시되지 않지만 의 요소 SqlRoleProvider 에는 데이터베이스 제한 시간(초)을 지정하는 특성이 포함될 commandTimeout 수도 있습니다. 기본값은 30입니다.

이 구성 태그가 준비되면 애플리케이션 내에서 역할 기능을 사용할 준비가 된 것입니다.

참고

위의 구성 태그는 요소의 enableddefaultProvider 특성을 사용하는 것을 <roleManager> 보여 줍니다. 역할 프레임워크가 사용자 단위로 역할 정보를 연결하는 방법에 영향을 주는 여러 가지 다른 특성이 있습니다. 역할 기반 권한 부여 자습서에서 이러한 설정을 검토합니다.

3단계: 역할 API 검사

역할 프레임워크의 기능은 역할 기반 작업을 수행하기 위한 13개의 공유 메서드를 포함하는 클래스를 통해 Roles노출됩니다. 4단계와 6단계에서 역할을 만들고 삭제하는 방법을 살펴보면 시스템에서 역할을 추가하거나 제거하는 및 DeleteRole 메서드를 사용합니다CreateRole.

시스템의 모든 역할 목록을 얻으려면 메서드를 GetAllRoles 사용합니다(5단계 참조). 메서드는 RoleExists 지정된 역할이 있는지 여부를 나타내는 부울 값을 반환합니다.

다음 자습서에서는 사용자를 역할과 연결하는 방법을 살펴봅니다. 클래스의 AddUserToRole, , AddUserToRolesAddUsersToRoleAddUsersToRoles 메서드는 Roles 하나 이상의 역할에 하나 이상의 사용자를 추가합니다. 역할에서 사용자를 제거하려면 , , RemoveUserFromRolesRemoveUsersFromRole또는 RemoveUsersFromRoles 메서드를 RemoveUserFromRole사용합니다.

역할 기반 권한 부여 자습서에서는 현재 로그인한 사용자의 역할에 따라 프로그래밍 방식으로 기능을 표시하거나 숨기는 방법을 살펴보겠습니다. 이를 위해 Role 클래스의 FindUsersInRole, , GetRolesForUserGetUsersInRole또는 IsUserInRole 메서드를 사용할 수 있습니다.

참고

이러한 메서드 중 하나가 호출될 때마다 클래스는 Roles 구성된 공급자에게 호출을 위임합니다. 이 경우 호출이 로 전송 SqlRoleProvider되고 있음을 의미합니다. 그런 다음 호출 SqlRoleProvider 된 메서드에 따라 적절한 데이터베이스 작업을 수행합니다. 예를 들어 코드 Roles.CreateRole("Administrators")SqlRoleProvider 는 저장 프로시저를 aspnet_Roles_CreateRole 실행하여 Administrators 라는 테이블에 새 레코드를 aspnet_Roles 삽입합니다.

이 자습서의 나머지 부분에서는 클래스의 CreateRole, GetAllRolesDeleteRole 메서드를 사용하여 Roles 시스템의 역할을 관리하는 방법을 살펴봅니다.

4단계: 새 역할 만들기

역할은 임의로 사용자를 그룹화할 수 있는 방법을 제공하며, 가장 일반적으로 이 그룹화는 권한 부여 규칙을 적용하는 보다 편리한 방법에 사용됩니다. 그러나 역할을 권한 부여 메커니즘으로 사용하려면 먼저 애플리케이션에 존재하는 역할을 정의해야 합니다. 안타깝게도 ASP.NET CreateRoleWizard 컨트롤은 포함되지 않습니다. 새 역할을 추가하려면 적합한 사용자 인터페이스를 만들고 역할 API를 직접 호출해야 합니다. 좋은 소식은 이것이 달성하기가 매우 쉽다는 것입니다.

참고

CreateRoleWizard 웹 컨트롤은 없지만 웹 애플리케이션의 구성을 보고 관리하는 데 도움이 되도록 설계된 로컬 ASP.NET 애플리케이션인 ASP.NET 웹 사이트 관리 도구가 있습니다. 그러나 두 가지 이유로 ASP.NET 웹 사이트 관리 도구의 열렬한 팬이 아닙니다. 첫째, 그것은 조금 버그이며 사용자 환경은 원하는 많은 잎. 둘째, ASP.NET 웹 사이트 관리 도구는 로컬에서만 작동하도록 설계되었으므로 라이브 사이트에서 역할을 원격으로 관리해야 하는 경우 고유한 역할 관리 웹 페이지를 빌드해야 합니다. 이러한 두 가지 이유로 이 자습서와 다음 자습서에서는 ASP.NET 웹 사이트 관리 도구에 의존하지 않고 웹 페이지에서 필요한 역할 관리 도구를 빌드하는 데 중점을 줍니다.

폴더에서 ManageRoles.aspxRoles 페이지를 열고 TextBox 및 단추 웹 컨트롤을 페이지에 추가합니다. TextBox 컨트롤의 ID 속성을 로 RoleName 설정하고 단추 및 ID 속성을 각각 및 Text 역할 만들기로 CreateRoleButton 설정합니다. 이 시점에서 페이지의 선언적 태그는 다음과 유사하게 표시됩니다.

<b>Create a New Role:</b>
<asp:TextBox ID="RoleName" runat="server"></asp:TextBox>
<br />
<asp:Button ID="CreateRoleButton" runat="server" Text="Create Role" />

다음으로 Designer 단추 컨트롤을 두 번 클릭하여 CreateRoleButton 이벤트 처리기를 만든 Click 다음 다음 코드를 추가합니다.

Protected Sub CreateRoleButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateRoleButton.Click
 Dim newRoleName As String = RoleName.Text.Trim()

 If Not Roles.RoleExists(newRoleName) Then
 ' Create the role
 Roles.CreateRole(newRoleName)
 End If

 RoleName.Text= String.Empty 
End Sub

위의 코드는 TextBox에 입력한 트리밍된 역할 이름을 변수에 RoleName 할당하여 newRoleName 시작합니다. 다음으로, Roles 클래스의 RoleExists 메서드를 호출하여 역할이 newRoleName 시스템에 이미 있는지 확인합니다. 역할이 없으면 메서드에 대한 호출 CreateRole 을 통해 생성됩니다. 메서드가 CreateRole 시스템에 이미 있는 역할 이름을 전달하면 예외가 ProviderException throw됩니다. 이 때문에 코드는 먼저 를 호출 CreateRole하기 전에 시스템에 역할이 없는지 확인합니다. Click 이벤트 처리기는 TextBox의 Text 속성을 지워 RoleName 종료합니다.

참고

사용자가 TextBox에 값을 RoleName 입력하지 않으면 어떤 일이 일어날지 궁금할 수 있습니다. 메서드에 CreateRole 전달된 값이 Nothing 또는 빈 문자열이면 예외가 발생합니다. 마찬가지로 역할 이름에 쉼표가 포함되어 있으면 예외가 발생합니다. 따라서 페이지에는 사용자가 역할을 입력하고 쉼표가 포함되어 있지 않은지 확인하기 위한 유효성 검사 컨트롤이 포함되어야 합니다. 나는 독자를위한 운동으로 떠난다.

Administrators라는 역할을 만들어 보겠습니다. 브라우저를 ManageRoles.aspx 통해 페이지를 방문하여 텍스트 상자에 관리자를 입력한 다음(그림 3 참조) 역할 만들기 단추를 클릭합니다.

관리자 역할 만들기

그림 3: 관리자 역할 만들기(전체 크기 이미지를 보려면 클릭)

어떻게 되나요? 포스트백이 발생하지만 역할이 실제로 시스템에 추가되었다는 시각적 신호는 없습니다. 시각적 피드백을 포함하도록 5단계에서 이 페이지를 업데이트합니다. 그러나 지금은 데이터베이스로 이동하여 SecurityTutorials.mdf 테이블의 데이터를 aspnet_Roles 표시하여 역할이 만들어졌는지 확인할 수 있습니다. 그림 4와 aspnet_Roles 같이 테이블에 방금 추가한 관리자 역할에 대한 레코드가 포함되어 있습니다.

aspnet_Roles 테이블에 관리자용 행이 있습니다.

그림 4: aspnet_Roles 테이블에 관리자용 행이 있습니다(전체 크기 이미지를 보려면 클릭).

5단계: 시스템에서 역할 표시

시스템의 현재 역할 목록을 포함하도록 페이지를 보강 ManageRoles.aspx 해 보겠습니다. 이렇게 하려면 페이지에 GridView 컨트롤을 추가하고 해당 ID 속성을 로 RoleList설정합니다. 다음으로, 다음 코드를 사용하여 라는 DisplayRolesInGrid 페이지의 코드 숨김 클래스에 메서드를 추가합니다.

Private Sub DisplayRolesInGrid()
 RoleList.DataSource = Roles.GetAllRoles()
 RoleList.DataBind()
End Sub

클래스의 GetAllRoles 메서드는 Roles 시스템의 모든 역할을 문자열 배열로 반환합니다. 그런 다음 이 문자열 배열은 GridView에 바인딩됩니다. 페이지가 처음 로드될 때 역할 목록을 GridView에 바인딩하려면 페이지의 Page_Load 이벤트 처리기에서 메서드를 호출 DisplayRolesInGrid 해야 합니다. 다음 코드는 페이지를 처음 방문할 때 이 메서드를 호출하지만 후속 포스트백에서는 호출하지 않습니다.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 If Not Page.IsPostBack Then
 DisplayRolesInGrid()
 End If 
End Sub

이 코드를 사용하면 브라우저를 통해 페이지를 방문합니다. 그림 5에서 볼 수 있듯이 항목이라는 레이블이 지정된 단일 열이 있는 표가 표시됩니다. 표에는 4단계에서 추가한 관리자 역할에 대한 행이 포함됩니다.

GridView는 단일 열에 역할을 표시합니다.

그림 5: GridView는 단일 열에 역할을 표시합니다(전체 크기 이미지를 보려면 클릭).

GridView의 AutoGenerateColumns 속성이 True(기본값)로 설정되어 있으므로 GridView는 Item이라는 고독한 열을 표시하므로 GridView는 의 각 속성에 DataSource대한 열을 자동으로 만듭니다. 배열에는 배열의 요소를 나타내는 단일 속성이 있으므로 GridView의 단일 열이 있습니다.

GridView를 사용하여 데이터를 표시할 때 GridView에서 암시적으로 생성하지 않고 열을 명시적으로 정의하는 것을 선호합니다. 열을 명시적으로 정의하면 데이터의 서식을 지정하고, 열을 다시 정렬하고, 다른 일반적인 작업을 수행하는 것이 훨씬 쉽습니다. 따라서 해당 열이 명시적으로 정의되도록 GridView의 선언적 태그를 업데이트해 보겠습니다.

먼저 GridView의 AutoGenerateColumns 속성을 False로 설정합니다. 다음으로 Grid에 TemplateField를 추가하고 해당 HeaderText 속성을 Roles로 설정하고 배열의 내용을 표시하도록 구성 ItemTemplate 합니다. 이 작업을 수행하려면 라는 RoleNameLabel 레이블 웹 컨트롤을 에 ItemTemplate 추가하고 해당 Text 속성을 에 바인딩합니다. Container.DataItem.

이러한 속성 및 ItemTemplate의 콘텐츠는 선언적으로 또는 GridView의 필드 대화 상자 및 템플릿 편집 인터페이스를 통해 설정할 수 있습니다. 필드 대화 상자에 도달하려면 GridView의 스마트 태그에서 열 편집 링크를 클릭합니다. 그런 다음 필드 자동 생성 확인란의 선택을 취소하여 속성을 False로 설정하고 AutoGenerateColumns GridView에 TemplateField를 추가하여 속성을 HeaderText Role로 설정합니다. 의 ItemTemplate콘텐츠를 정의하려면 GridView의 스마트 태그에서 템플릿 편집 옵션을 선택합니다. 레이블 웹 컨트롤을 로 끌어서 ItemTemplate속성을 ID 로 설정하고 해당 속성 RoleNameLabelText 에 바인딩 Container.DataItem되도록 데이터 바인딩 설정을 구성합니다.

사용하는 방법에 관계없이 GridView의 결과 선언적 태그는 완료되면 다음과 유사하게 표시됩니다.

<asp:GridView ID="RoleList" runat="server" AutoGenerateColumns="false">
 <Columns>
 <asp:TemplateField HeaderText="Role">
 <ItemTemplate>
 <asp:Label runat="server" ID="RoleNameLabel" Text='<%# Container.DataItem %>' />
 </ItemTemplate>
 </asp:TemplateField>
 </Columns>
</asp:GridView>

참고

배열의 내용은 데이터 바인딩 구문을 <%# Container.DataItem %>사용하여 표시됩니다. GridView에 바인딩된 배열의 내용을 표시할 때 이 구문이 사용되는 이유에 대한 자세한 설명은 이 자습서의 scope. 이 문제에 대한 자세한 내용은 스칼라 배열을 데이터 웹 컨트롤에 바인딩을 참조하세요.

현재 RoleList GridView는 페이지를 처음 방문할 때만 역할 목록에 바인딩됩니다. 새 역할이 추가되면 그리드를 새로 고쳐야 합니다. 이렇게 하려면 새 역할이 만들어지면 메서드를 CreateRoleButton 호출 DisplayRolesInGrid 하도록 Button의 Click 이벤트 처리기를 업데이트합니다.

Protected Sub CreateRoleButton_Click(ByVal sender As Object,ByVal e As System.EventArgs) Handles CreateRoleButton.Click
 Dim newRoleName As String = RoleName.Text.Trim()

 If Not Roles.RoleExists(newRoleName) Then
 ' Create the role
 Roles.CreateRole(newRoleName)

 ' Refresh the RoleList Grid
 DisplayRolesInGrid()
 End If

 RoleName.Text = String.Empty 
End Sub

이제 사용자가 새 역할을 RoleList 추가하면 GridView는 포스트백에 방금 추가된 역할을 표시하여 역할이 성공적으로 생성되었다는 시각적 피드백을 제공합니다. 이를 설명하려면 브라우저를 ManageRoles.aspx 통해 페이지를 방문하여 감독자라는 역할을 추가합니다. 역할 만들기 단추를 클릭하면 포스트백이 계속되고 그리드가 업데이트되어 관리자와 새 역할인 감독자가 포함됩니다.

감독자 역할이 추가되었습니다.

그림 6: 감독자 역할이 추가되었습니다(전체 크기 이미지를 보려면 클릭).

6단계: 역할 삭제

이 시점에서 사용자는 새 역할을 만들고 페이지에서 모든 기존 역할을 ManageRoles.aspx 볼 수 있습니다. 사용자가 역할을 삭제하도록 허용해 보겠습니다. 메서드에는 Roles.DeleteRole 두 개의 오버로드가 있습니다.

  • DeleteRole(roleName) - roleName 역할을 삭제합니다. 역할에 하나 이상의 멤버가 포함된 경우 예외가 throw됩니다.
  • DeleteRole(roleName, throwOnPopulatedRole) - roleName 역할을 삭제합니다. throwOnPopulateRoleTrue이면 역할에 하나 이상의 멤버가 포함된 경우 예외가 throw됩니다. throwOnPopulateRoleFalse이면 멤버가 포함되어 있는지 여부에 관계없이 역할이 삭제됩니다. 내부적으로 메서드는 를 DeleteRole(roleName) 호출합니다 DeleteRole(roleName, True).

roleName이 또는 빈 문자열이거나 roleName에 쉼표가 Nothing 포함된 경우에도 메서드 가 예외를 throw합니다.DeleteRole roleName이 시스템에 DeleteRole 없는 경우 는 예외를 발생시키지 않고 자동으로 실패합니다.

클릭할 때 선택한 역할을 삭제하는 삭제 단추를 포함하도록 GridView ManageRoles.aspx 를 확대해 보겠습니다. 먼저 필드 대화 상자로 이동하여 CommandField 옵션 아래에 있는 삭제 단추를 추가하여 GridView에 삭제 단추를 추가합니다. 삭제 단추를 맨 왼쪽 열로 만들고 해당 DeleteText 속성을 역할 삭제 로 설정합니다.

RoleList GridView에 삭제 단추 추가

그림 7: GridView에 RoleList 삭제 단추 추가(전체 크기 이미지를 보려면 클릭)

삭제 단추를 추가한 후 GridView의 선언적 태그는 다음과 유사하게 표시됩니다.

<asp:GridView ID="RoleList" runat="server" AutoGenerateColumns="False">
 <Columns>
 <asp:CommandField DeleteText="Delete Role" ShowDeleteButton="True" />
 <asp:TemplateField HeaderText="Role">
 <ItemTemplate>
 <asp:Label runat="server" ID="RoleNameLabel" Text='<%# Container.DataItem %>' />
 </ItemTemplate>
 </asp:TemplateField>
 </Columns> 
</asp:GridView>

다음으로 GridView RowDeleting 의 이벤트에 대한 이벤트 처리기를 만듭니다. 역할 삭제 단추를 클릭할 때 포스트백 시 발생하는 이벤트입니다. 다음 코드를 이벤트 처리기에 추가합니다.

Protected Sub RoleList_RowDeleting(ByVal sender As Object,ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles RoleList.RowDeleting
 ' Get the RoleNameLabel
 Dim RoleNameLabel As Label = CType(RoleList.Rows(e.RowIndex).FindControl("RoleNameLabel"),Label)

 ' Delete the role
 Roles.DeleteRole(RoleNameLabel.Text,False)

 ' Rebind the data to the RoleList grid
 DisplayRolesInGrid()
End Sub

코드는 역할 삭제 단추를 클릭한 행의 웹 컨트롤을 프로그래밍 방식으로 참조하여 RoleNameLabel 시작합니다. 그런 다음 메서드가 Roles.DeleteRole 호출되어 및 의 RoleNameLabel 를 전달 Text 하여 역할과 False연결된 사용자가 있는지 여부에 관계없이 역할을 삭제합니다. 마지막으로 방금 RoleList 삭제한 역할이 더 이상 그리드에 표시되지 않도록 GridView가 새로 고쳐집니다.

참고

역할 삭제 단추는 역할을 삭제하기 전에 사용자에게 어떤 종류의 확인도 요구하지 않습니다. 작업을 확인하는 가장 쉬운 방법 중 하나는 클라이언트 쪽 확인 대화 상자를 사용하는 것입니다. 이 기술에 대한 자세한 내용은 삭제 시 Client-Side 확인 추가를 참조하세요.

요약

많은 웹 애플리케이션에는 특정 사용자 클래스에서만 사용할 수 있는 특정 권한 부여 규칙 또는 페이지 수준 기능이 있습니다. 예를 들어 관리자만 액세스할 수 있는 웹 페이지 집합이 있을 수 있습니다. 이러한 권한 부여 규칙을 사용자 단위로 정의하는 대신 역할을 기반으로 규칙을 정의하는 것이 더 유용한 경우가 많습니다. 즉, Scott 및 Jisun 사용자가 관리 웹 페이지에 명시적으로 액세스할 수 있도록 허용하는 대신 관리자 역할의 멤버가 이러한 페이지에 액세스할 수 있도록 허용한 다음 Scott 및 Jisun을 관리자 역할에 속한 사용자로 표시하는 것이 더 유지 관리 가능한 방법입니다.

역할 프레임워크를 사용하면 역할을 쉽게 만들고 관리할 수 있습니다. 이 자습서에서는 Microsoft SQL Server 데이터베이스를 역할 저장소로 사용하는 을 사용하도록 SqlRoleProvider역할 프레임워크를 구성하는 방법을 검토했습니다. 또한 시스템의 기존 역할을 나열하고 새 역할을 만들고 기존 역할을 삭제할 수 있는 웹 페이지를 만들었습니다. 후속 자습서에서는 역할에 사용자를 할당하는 방법과 역할 기반 권한 부여를 적용하는 방법을 살펴봅니다.

행복한 프로그래밍!

추가 정보

이 자습서에서 설명하는 topics 대한 자세한 내용은 다음 리소스를 참조하세요.

저자 정보

여러 ASP/ASP.NET 책의 저자이자 4GuysFromRolla.com 창립자인 Scott Mitchell은 1998년부터 Microsoft 웹 기술을 연구해 왔습니다. Scott은 독립 컨설턴트, 트레이너 및 작가로 일합니다. 그의 최신 책은 샘스 티치 유어셀프 ASP.NET 24시간 만에 2.0입니다. Scott은 에서 mitchell@4guysfromrolla.com 또는 에서 자신의 블로그 http://ScottOnWriting.NET를 통해 연락할 수 있습니다.

특별 감사

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자로는 Alicja Maziarz, Suchi Banerjee 및 Teresa Murphy가 있습니다. 예정된 MSDN 문서를 검토하는 데 관심이 있으신가요? 그렇다면 에서 줄을 놓습니다. mitchell@4GuysFromRolla.com