다음을 통해 공유


방법: 사용자 지정 권한 부여 특성 만들기

이 항목에서는 권한 부여에 대한 사용자 지정 특성을 추가하는 방법을 보여 줍니다. WCF RIA Services 프레임워크는 RequiresAuthenticationAttributeRequiresRoleAttribute 특성을 제공합니다. 이들 특성을 사용하면 인증된 사용자나 특정 역할의 사용자만 이용 가능한 도메인 작업을 손쉽게 지정할 수 있습니다. 이 두 특성 이외에도 사용자 지정된 권한 부여 논리를 나타내는 특성을 만들어 도메인 작업에 적용할 수 있습니다.

도메인 서비스를 노출하면 네트워크의 모든 사용자가 해당 도메인 서비스를 사용할 수 있습니다. 클라이언트 응용 프로그램이 도메인 서비스에 액세스할 유일한 응용 프로그램이라고 가정할 수는 없습니다. 사용자 지정된 인증 특성을 사용하여 클라이언트 응용 프로그램 외부에서 도메인 작업에 액세스할 때도 도메인 작업에 대한 액세스를 제한할 수 있습니다.

이 항목에서는 AuthorizationAttribute에서 파생되는 클래스를 만들고 IsAuthorized 메서드를 재정의하여 사용자 지정된 논리를 제공하는 방식으로 사용자 지정 권한 부여 특성을 만듭니다. IPrincipal 매개 변수와 AuthorizationContext 매개 변수를 사용하여 사용자 지정된 인증 코드 내에 필요할 수 있는 정보에 액세스할 수 있습니다. AuthorizationContext 개체는 쿼리 작업에서 null입니다.

사용자 지정된 권한 부여 특성을 만들려면

  1. 서버 프로젝트에서 AuthorizationAttribute로부터 파생되는 클래스를 만듭니다.

  2. IsAuthorized 메서드를 재정의하고 권한 부여를 결정하는 논리를 추가합니다.

    다음 예제에서는 인증된 사용자가 EmployeePayHistory 레코드를 수정 중인 직원의 관리자인지 여부를 확인하는 RestrictAccessToAssignedManagers라는 사용자 지정 특성을 보여 줍니다.

    Public Class RestrictAccessToAssignedManagers
        Inherits AuthorizationAttribute
    
        Protected Overrides Function IsAuthorized(ByVal principal As System.Security.Principal.IPrincipal, ByVal authorizationContext As System.ComponentModel.DataAnnotations.AuthorizationContext) As System.ComponentModel.DataAnnotations.AuthorizationResult
            Dim eph As EmployeePayHistory
            Dim selectedEmployee As Employee
            Dim authenticatedUser As Employee
    
            eph = CType(authorizationContext.Instance, EmployeePayHistory)
    
            Using context As New AdventureWorksEntities()
                selectedEmployee = context.Employees.SingleOrDefault(Function(e) e.EmployeeID = eph.EmployeeID)
                authenticatedUser = context.Employees.SingleOrDefault(Function(e) e.LoginID = principal.Identity.Name)
            End Using
    
            If (selectedEmployee.ManagerID = authenticatedUser.EmployeeID) Then
                Return AuthorizationResult.Allowed
            Else
                Return New AuthorizationResult("Only the authenticated manager for the employee can add a new record.")
            End If
        End Function
    End Class
    
    public class RestrictAccessToAssignedManagers : AuthorizationAttribute
    {
        protected override AuthorizationResult IsAuthorized(System.Security.Principal.IPrincipal principal, AuthorizationContext authorizationContext)
        {
            EmployeePayHistory eph = (EmployeePayHistory)authorizationContext.Instance;
            Employee selectedEmployee;
            Employee authenticatedUser;
    
            using (AdventureWorksEntities context = new AdventureWorksEntities())
            {
                selectedEmployee = context.Employees.SingleOrDefault(e => e.EmployeeID == eph.EmployeeID);
                authenticatedUser = context.Employees.SingleOrDefault(e => e.LoginID == principal.Identity.Name);
            }
    
            if (selectedEmployee.ManagerID == authenticatedUser.EmployeeID)
            {
                return AuthorizationResult.Allowed;
            }
            else
            {
                return new AuthorizationResult("Only the authenticated manager for the employee can add a new record.");
            }
        }
    }
    
  3. 사용자 지정된 권한 부여 논리를 수행하려면 도메인 작업에 사용자 지정 권한 부여 특성을 적용합니다.

    다음 예제에서는 도메인 작업에 적용된 RestrictAccessToAssignedManagers 특성을 보여 줍니다.

    <RestrictAccessToAssignedManagers()> _
    Public Sub InsertEmployeePayHistory(ByVal employeePayHistory As EmployeePayHistory)
        If ((employeePayHistory.EntityState = EntityState.Detached) _
                    = False) Then
            Me.ObjectContext.ObjectStateManager.ChangeObjectState(employeePayHistory, EntityState.Added)
        Else
            Me.ObjectContext.EmployeePayHistories.AddObject(employeePayHistory)
        End If
    End Sub
    
    [RestrictAccessToAssignedManagers]
    public void InsertEmployeePayHistory(EmployeePayHistory employeePayHistory)
    {
        if ((employeePayHistory.EntityState != EntityState.Detached))
        {
            this.ObjectContext.ObjectStateManager.ChangeObjectState(employeePayHistory, EntityState.Added);
        }
        else
        {
            this.ObjectContext.EmployeePayHistories.AddObject(employeePayHistory);
        }
    }