역할 공급자 구현

Visual Studio 2010

업데이트: 2007년 11월

ASP.NET 역할 관리를 사용하면 ASP.NET 응용 프로그램에 여러 종류의 공급자를 쉽게 사용할 수 있습니다. .NET Framework에 포함되어 제공되는 프로필 공급자를 사용할 수도 있고 사용자가 직접 공급자를 구현할 수도 있습니다.

사용자 지정 역할 공급자를 만드는 주요 이유는 두 가지입니다.

  • FoxPro 데이터베이스, Oracle 데이터베이스 또는 다른 데이터 소스와 같이 .NET Framework에 포함된 역할 공급자에서 지원되지 않는 데이터 소스에 역할 정보를 저장해야 합니다.

  • .NET Framework에서 제공된 공급자가 사용하는 데이터베이스 스키마와는 다른 데이터베이스 스키마를 사용하여 역할 정보를 관리해야 합니다. 이에 대한 일반적인 예로는 회사 또는 웹 사이트의 SQL Server 데이터베이스에 이미 있는 인증 데이터를 들 수 있습니다.

역할 공급자를 구현하려면 System.Web.Security 네임스페이스에서 RoleProvider 추상 클래스를 상속하는 클래스를 만듭니다. RoleProvider 추상 클래스는 System.Configuration.Provider 네임스페이스에서 ProviderBase 추상 클래스를 상속합니다. 그 결과 ProviderBase 클래스의 필수 멤버도 함께 구현해야 합니다. 다음 표에서는 ProviderBaseRoleProvider 추상 클래스에서 구현해야 하는 필수 속성 및 메서드와 각각의 설명을 보여 줍니다. 각 멤버에 대한 구현을 검토하려면 샘플 역할 공급자 구현에 있는 코드를 참조하십시오.

ProviderBase 멤버

멤버

설명

Initialize 메서드

구성 설정의 NameValueCollection과 공급자의 이름을 입력으로 사용합니다. 구성 파일(Machine.config 또는 Web.config)에 지정된 특정 구현 값과 옵션을 포함하여 공급자 인스턴스에 대한 속성 값을 설정하는 데 사용됩니다.

RoleProvider 멤버

멤버

설명

ApplicationName 속성

구성 파일(Web.config)에 지정된 역할 정보를 사용하는 응용 프로그램의 이름입니다. ApplicationName은 관련된 사용자 정보와 함께 데이터 소스에 저장되고 사용자 정보를 쿼리할 때 사용됩니다. 자세한 내용은 이 항목 뒷부분의 ApplicationName 단원을 참조하십시오.

이 속성은 읽기/쓰기가 가능하며 명시적으로 지정된 값이 없으면 기본값이 ApplicationPath입니다.

AddUsersToRoles 메서드

사용자 이름 목록과 역할 이름 목록을 입력으로 사용하고 구성된 ApplicationName에 대한 데이터 소스에서 지정된 역할과 지정된 사용자를 연결합니다.

지정된 역할 이름이나 사용자 이름 중 하나라도 구성된 ApplicationName에 없는 경우 ProviderException을 throw해야 합니다.

지정한 사용자 이름 또는 역할 이름이 빈 문자열이면 ArgumentException을 throw하고 지정한 사용자 이름 또는 역할 이름이 null(Visual Basic의 경우Nothing)이면 ArgumentNullException을 throw해야 합니다.

데이터 소스가 트랜잭션을 지원하면 트랜잭션에 각각의 추가 작업을 포함시키고, 추가 작업이 실패하면 트랜잭션을 롤백하고 예외를 throw해야 합니다.

CreateRole 메서드

역할 이름을 입력으로 사용하고 구성된 ApplicationName에 대한 데이터 소스에 지정된 역할을 추가합니다.

지정된 역할 이름이 구성된 ApplicationName에 이미 있는 경우 ProviderException을 throw해야 합니다.

지정된 역할 이름이 빈 문자열이거나, 쉼표가 포함되어 있거나 데이터 소스에서 허용하는 최대 길이를 초과하면 ArgumentException을 throw하고 지정된 역할 이름이 null(Visual Basic의 경우Nothing)이면 ArgumentNullException을 throw해야 합니다.

DeleteRole 메서드

역할 이름과 부울 값을 입력으로 사용합니다. 부울 값은 역할과 연결된 사용자가 있을 경우 예외를 throw할지 여부를 지정합니다. DeleteRole은 구성된 ApplicationName에 대한 데이터 소스에서 지정된 역할을 삭제합니다.

throwOnPopulatedRole 매개 변수가 true이고 역할 이름 매개 변수로 식별되는 역할에 멤버가 하나 이상 있는 경우 ProviderException을 throw하고 역할을 삭제하지 않습니다. throwOnPopulatedRole 매개 변수가 false이면 역할에 멤버가 있는지 여부에 상관없이 역할을 삭제합니다.

데이터 소스에서 역할을 삭제할 때는 구성된 ApplicationName에 대해 사용자 이름과 삭제된 역할 사이의 연결도 삭제해야 합니다.

지정된 역할 이름이 없거나 빈 문자열인 경우 ArgumentException을 throw해야 합니다. 지정된 역할 이름이 null(Visual Basic의 경우Nothing)이면 ArgumentNullException을 throw해야 합니다.

FindUsersInRole 메서드

검색할 역할 이름 및 사용자 이름을 입력으로 사용하고 구성된 ApplicationName에 대해 제공된 usernameToMatch의 일치 항목이 사용자 이름에 있는 역할의 사용자 목록을 반환합니다. 와일드카드는 데이터 소스에 따라 지원됩니다. 사용자는 사용자 이름의 사전순으로 반환됩니다.

지정된 역할 이름이 데이터 소스에 없는 경우 ProviderException을 throw하는 것이 좋습니다.

GetAllRoles 메서드

데이터 소스에서 역할 이름 목록을 반환합니다. 지정된 ApplicationName에 대한 역할만 검색됩니다.

구성된 ApplicationName에 지정된 사용자의 역할이 없으면 요소 없이 문자열 배열을 반환해야 합니다.

GetRolesForUser 메서드

사용자 이름을 입력으로 사용하고 지정된 사용자와 연결된 역할 이름을 데이터 소스에서 반환합니다. 구성된 ApplicationName에 대한 역할만 검색됩니다.

구성된 ApplicationName에 지정된 사용자의 역할이 없으면 요소 없이 문자열 배열을 반환해야 합니다.

지정된 사용자 이름이 빈 문자열이면 ArgumentException을 throw해야 합니다. 지정된 사용자 이름이 null(Visual Basic의 경우Nothing)이면 ArgumentNullException을 throw해야 합니다.

GetUsersInRole 메서드

역할 이름을 입력으로 사용하고 역할과 연결된 사용자 이름을 데이터 소스에서 반환합니다. 구성된 ApplicationName에 대한 역할만 검색됩니다.

지정된 역할 이름이 구성된 ApplicationName에 없는 경우 ProviderException을 throw해야 합니다.

구성된 ApplicationName에 대해 지정된 역할과 연결된 사용자가 없으면 요소 없이 문자열 배열을 반환해야 합니다.

지정된 역할 이름이 빈 문자열이거나, 쉼표가 포함되어 있거나, 데이터 소스에서 허용하는 역할 이름의 최대 길이를 초과하면 ArgumentException을 throw해야 합니다. 지정된 역할 이름이 null(Visual Basic의 경우Nothing)이면 ArgumentNullException을 throw해야 합니다.

IsUserInRole 메서드

사용자 이름과 역할 이름을 입력으로 사용하고 현재 로그온된 사용자가 구성된 ApplicationName에 대해 데이터 소스의 역할과 연결되어 있는지 여부를 확인합니다.

지정된 역할 이름이나 사용자 이름이 구성된 ApplicationName에 없는 경우 ProviderException을 throw해야 합니다.

지정한 사용자 이름 또는 역할 이름이 빈 문자열이면 ArgumentException을 throw하고 지정한 사용자 이름 또는 역할 이름이 null(Visual Basic의 경우Nothing)이면 ArgumentNullException을 throw해야 합니다.

RemoveUsersFromRoles 메서드

사용자 이름 목록과 역할 이름 목록을 입력으로 사용하고 구성된 ApplicationName에 대해 데이터 소스에서 지정된 사용자에 대한 연결을 제거합니다.

지정된 역할 이름이나 사용자 이름 중 하나라도 구성된 ApplicationName에 없는 경우 ProviderException을 throw해야 합니다.

지정한 사용자 이름 또는 역할 이름이 빈 문자열이면 ArgumentException을 throw하고 지정한 사용자 이름 또는 역할 이름이 null(Visual Basic의 경우Nothing)이면 ArgumentNullException을 throw해야 합니다.

데이터 소스가 트랜잭션을 지원하면 트랜잭션에 각각의 제거 작업을 포함시키고, 제거 작업이 실패하면 트랜잭션을 롤백하고 예외를 throw해야 합니다.

RoleExists 메서드

역할 이름을 입력으로 사용하고 구성된 ApplicationName에 대해 데이터 소스에 역할 이름이 있는지 확인합니다.

지정된 역할 이름이 없거나 빈 문자열인 경우 ArgumentException을 throw해야 합니다. 지정된 역할 이름이 null(Visual Basic의 경우Nothing)이면 ArgumentNullException을 throw하는 것이 좋습니다.

역할 공급자는 각 응용 프로그램에 대한 역할 정보를 고유하게 저장합니다. 따라서 여러 ASP.NET 응용 프로그램은 중복되는 사용자 이름이 사용되는 경우에도 충돌 없이 같은 데이터 소스를 사용할 수 있습니다. 또는 여러 ASP.NET 응용 프로그램이 같은 ApplicationName을 지정하여 같은 역할 데이터 소스를 사용할 수 있습니다.

역할 공급자는 각 응용 프로그램에 대한 역할 정보를 고유하게 저장하기 때문에 데이터 스키마에 응용 프로그램 이름이 포함되어 있고 쿼리 및 업데이트에도 응용 프로그램 이름이 포함되어 있는지 확인해야 합니다. 예를 들어 다음 명령은 데이터베이스에서 역할 이름을 검색하는 데 사용되며 ApplicationName이 쿼리에 포함되어 있는지 확인합니다.

SELECT Rolename FROM Roles 
  WHERE Rolename = 'Administrators' AND ApplicationName = 'MyApplication'

응용 프로그램의 구성에 지정된 각 역할 공급자에 대해 ASP.NET은 HttpApplication 개체에서 제공되는 모든 요청에 대해 사용되는 단일 역할 공급자 인스턴스를 인스턴스화합니다. 그 결과 여러 요청을 동시에 실행할 수 있습니다. ASP.NET은 공급자 호출에 대해 스레드로부터의 안전성을 보장하지 않습니다. 스레드로부터의 안전성을 보장하도록 공급자 코드를 작성해야 합니다. 예를 들어 데이터베이스에 대한 연결을 만들거나 편집할 파일을 여는 작업은 Initialize 메서드가 호출될 때 파일 또는 데이터베이스 연결을 여는 대신 AddUsersToRoles과 같이 호출된 멤버 내에서 수행됩니다.

표시: