인증, 역할 및 프로필

사용자의 자격 증명을 확인하거나, 특정 작업에 대한 액세스를 제한하거나, 클라이언트 프로젝트에서 각 사용자에 대한 속성을 유지하려면 WCF RIA Services 솔루션에 인증 도메인 서비스를 추가합니다. 기존의 ASP.NET 웹 응용 프로그램에서는 ASP.NET 멤버 자격 프레임워크를 사용하여 이러한 기능을 수행할 수 있습니다. RIA Services 는 인증 도메인 서비스를 통해 리치 인터넷 클라이언트에 멤버 자격 프레임워크를 노출하여 ASP.NET 멤버 자격 프레임워크를 기반으로 빌드됩니다. 인증 도메인 서비스를 추가한 후에는 다음 기능을 사용할 수 있습니다.

  • 인증 - 사용자의 자격 증명을 확인하고 사용자를 로그인 또는 로그아웃한 상태로 표시합니다.

  • 역할 - 책임별로 사용자를 그룹화하고 그룹의 인증된 멤버에게 리소스 권한을 부여합니다.

  • 프로필 - 인증된 사용자에 대한 속성을 유지하고 응용 프로그램에서 해당 속성을 검색합니다.

이 항목에서는 RIA Services 솔루션에서 인증, 역할 및 프로필을 사용하는 방법을 소개합니다.

인증 도메인 서비스

RIA Services 에서는 프레젠테이션 계층에서 인증, 역할 및 프로필에 쉽게 액세스할 수 있도록 인증 도메인 서비스 템플릿을 제공합니다. 인증 도메인 서비스를 만들려면 서버 프로젝트에서 인증 도메인 서비스 템플릿을 선택하여 새 항목을 만들면 됩니다.

RIA_ServicesAddAuth

인증 도메인 서비스를 추가하면 RIA Services 프레임워크에서 자동으로 서버 프로젝트에 두 클래스를 추가합니다. 인증 서비스를 나타내는 클래스는 AuthenticationBase 클래스에서 파생됩니다. 사용자를 나타내는 클래스는 UserBase 클래스에서 파생됩니다. 사용자 클래스에는 인증된 사용자에 대한 프로필 속성이 포함되어 있습니다.

솔루션을 빌드하면 RIA Services에서 자동으로 클라이언트 프로젝트에 WebContext 클래스를 생성합니다. WebContext 클래스를 사용하여 클라이언트 프로젝트의 사용자와 인증 도메인 서비스에 액세스할 수 있습니다. Current 속성을 사용하여 WebContext의 현재 인스턴스를 검색합니다. WebContext 클래스는 WebContextBase에서 파생됩니다.

RIA Services 솔루션에 인증 도메인 서비스를 추가하는 방법에 대한 예제는 연습: Silverlight 탐색 응용 프로그램에서 인증 서비스 사용을 참조하십시오.

Silverlight 비즈니스 응용 프로그램 및 인증

Silverlight 비즈니스 응용 프로그램 템플릿을 선택하여 솔루션을 만들 경우 사용자 로그인 및 등록 관리를 위한 인증 도메인 서비스와 컨트롤이 솔루션에 자동으로 포함되어 있습니다. 솔루션에서는 기본적으로 폼 인증을 사용하지만 Windows 인증을 사용하도록 쉽게 솔루션을 구성할 수 있습니다. 여러 역할이 사용되고 하나의 프로필 속성이 정의됩니다. Silverlight 비즈니스 응용 프로그램에 기본적으로 포함되는 인증 기능의 예와 폼 인증에서 Windows 인증으로 구성을 변경하는 방법은 연습: Silverlight 비즈니스 응용 프로그램 템플릿 사용을 참조하십시오. Silverlight 비즈니스 응용 프로그램의 기본 기능을 기반으로 빌드하는 예제는 연습: Silverlight 비즈니스 응용 프로그램에서 인증 서비스 사용을 참조하십시오.

다음 그림에서는 Silverlight 비즈니스 응용 프로그램에 포함되는 기본 기능 중 하나인 등록 창을 보여 줍니다.

등록 대화 상자

인증

RIA Services는 솔루션에서 폼 인증이나 Windows 인증을 쉽게 구현할 수 있도록 하는 클래스를 제공합니다. RIA Services 솔루션에서 인증을 사용하려면 인증에 맞게 서버 프로젝트와 클라이언트 프로젝트를 구성해야 합니다. 자세한 내용은 방법: RIA Services에서 인증 사용을 참조하십시오.

서버 및 클라이언트 프로젝트를 구성한 후에는 WebContext 개체에 대해 Login 메서드를 호출하여 Silverlight 응용 프로그램에서 사용자를 비동기적으로 로그인합니다. Windows 인증을 사용하거나 보관된 자격 증명을 가진 사용자를 검색할 때는 Login 메서드를 호출할 필요가 없습니다. 대신 LoadUser 메서드를 호출하여 Windows 인증을 통해 인증된 사용자를 검색하거나 보관된 자격 증명을 가진 사용자를 로드합니다.

다음은 인증을 구현한 경우 클라이언트 프로젝트에 일반적으로 사용되는 메서드와 속성입니다.

멤버 사용할 코드 작업

Authentication

WebContext.Current.Authentication

인증 서비스에 액세스합니다.

User

WebContext.Current.User

사용자의 상태를 포함하는 개체에 액세스합니다.

Login

-또는-

Login

-또는-

Login

WebContext.Current.Authentication.Login(string, string)

-또는-

WebContext.Current.Authentication.Login(LoginParameters)

-또는-

WebContext.Current.Authentication.Login(LoginParameters, LoginOperation, object)

비동기적으로 사용자의 자격 증명 확인합니다.

Logout

-또는-

Logout

WebContext.Current.Authentication.Logout(boolean)

-또는-

WebContext.Current.Authentication.Logout(LogoutOperation, object)

인증된 사용자를 비동기적으로 로그아웃합니다.

LoadUser

-또는-

LoadUser

WebContext.Current.Authentication.LoadUser()

-또는-

WebContext.Current.Authentication.LoadUser(LoadUserOperation, object)

인증된 사용자를 로드하거나, 사용자 상태를 새로 고치거나, 보관된 사용자 인증을 로드하거나, Windows 인증과 함께 사용 시 보안 주체 사용자 개체를 검색합니다.

다음 예제에서는 로그인 단추에 대한 이벤트 처리기에서 Login 메서드를 호출하는 방법을 보여 줍니다. 로그인 작업의 결과에 응답하기 위해 콜백 메서드가 포함됩니다.

Private Sub LoginButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim lp As LoginParameters = New LoginParameters(UserName.Text, Password.Password)
    WebContext.Current.Authentication.Login(lp, AddressOf Me.LoginOperation_Completed, Nothing)
    LoginButton.IsEnabled = False
    LoginResult.Text = ""
End Sub

Private Sub LoginOperation_Completed(ByVal lo As LoginOperation)
    If (lo.HasError) Then
        LoginResult.Text = lo.Error.Message
        LoginResult.Visibility = System.Windows.Visibility.Visible
        lo.MarkErrorAsHandled()
    ElseIf (lo.LoginSuccess = False) Then
        LoginResult.Text = "Login failed. Please check user name and password."
        LoginResult.Visibility = System.Windows.Visibility.Visible
    ElseIf (lo.LoginSuccess = True) Then
        SetControlVisibility(True)
    End If
    LoginButton.IsEnabled = True
End Sub
private void LoginButton_Click(object sender, RoutedEventArgs e)
{
    LoginParameters lp = new LoginParameters(UserName.Text, Password.Password);
    WebContext.Current.Authentication.Login(lp, this.LoginOperation_Completed, null);
    LoginButton.IsEnabled = false;
    LoginResult.Text = "";
}

private void LoginOperation_Completed(LoginOperation lo)
{
    if (lo.HasError)
    {
        LoginResult.Text = lo.Error.Message;
        LoginResult.Visibility = System.Windows.Visibility.Visible;
        lo.MarkErrorAsHandled();
    }
    else if (lo.LoginSuccess == false)
    {
        LoginResult.Text = "Login failed. Please check user name and password.";
        LoginResult.Visibility = System.Windows.Visibility.Visible;
    }
    else if (lo.LoginSuccess == true)
    {
        SetControlVisibility(true);
    }
    LoginButton.IsEnabled = true;
}

역할

인증을 구현한 후에는 역할을 사용하도록 솔루션을 구성할 수 있습니다. 역할을 사용하여 그룹에 사용자를 할당한 다음 해당 역할의 멤버만 특정 도메인 작업을 사용할 수 있게 지정할 수 있습니다. 도메인 작업에 RequiresRoleAttribute를 적용하여 도메인 작업에 대한 액세스를 제한합니다. 자세한 내용은 방법: RIA Services에서 역할 사용을 참조하십시오.

다음은 역할을 구현한 경우 일반적으로 사용되는 메서드와 속성입니다.

멤버 사용할 코드 작업

Roles

WebContext.Current.User.Roles

사용자에게 할당된 역할에 액세스합니다.

IsInRole

WebContext.Current.User.IsInRole(string)

인증된 사용자가 지정된 역할의 멤버인지 여부를 확인합니다.

다음 예제에서는 Managers라는 역할의 멤버로 액세스가 제한된 도메인 작업을 보여 줍니다.

<RequiresRole("Managers")> _
Public Function GetCustomers() As IQueryable(Of Customer)
    Return Me.ObjectContext.Customers
End Function
[RequiresRole("Managers")]
public IQueryable<Customer> GetCustomers()
{
    return this.ObjectContext.Customers;
}

사용자에게 필수 자격 증명이 없을 때 도메인 작업을 호출하면 도메인 작업에서 예외가 반환됩니다. 도메인 작업을 호출하기 전에 자격 증명을 확인하여 이러한 상황을 피할 수 있습니다. 다음 예제에서는 데이터를 로드하기 전에 사용자가 필요한 역할의 멤버인지 여부를 확인하는 방법을 보여 줍니다.

Private Sub LoadRestrictedReports()
    Dim loadSales = context.Load(context.GetSalesOrderHeadersQuery().Take(numberOfRows))
    SalesOrdersGrid.ItemsSource = loadSales.Entities
    SalesOrdersGrid.Visibility = System.Windows.Visibility.Visible

    If (WebContext.Current.User.IsInRole("Managers")) Then
        Dim loadCustomers = context.Load(context.GetCustomersQuery().Take(numberOfRows))
        CustomersGrid.ItemsSource = loadCustomers.Entities
        CustomersGrid.Visibility = System.Windows.Visibility.Visible
    Else
        CustomersGrid.Visibility = System.Windows.Visibility.Collapsed
    End If
End Sub
private void LoadRestrictedReports()
{
    LoadOperation<SalesOrderHeader> loadSales = context.Load(context.GetSalesOrderHeadersQuery().Take(numberOfRows));
    SalesOrdersGrid.ItemsSource = loadSales.Entities;
    SalesOrdersGrid.Visibility = System.Windows.Visibility.Visible;

    if (WebContext.Current.User.IsInRole("Managers"))
    {
        LoadOperation<Customer> loadCustomers = context.Load(context.GetCustomersQuery().Take(numberOfRows));
        CustomersGrid.ItemsSource = loadCustomers.Entities;
        CustomersGrid.Visibility = System.Windows.Visibility.Visible;
    }
    else
    {
        CustomersGrid.Visibility = System.Windows.Visibility.Collapsed;
    }
}

프로필

프로필 속성을 사용하면 사용자 정보를 저장할 수 있습니다. 이러한 속성을 사용하여 각 사용자에 대해 응용 프로그램을 사용자 지정할 수 있습니다. 솔루션에서 프로필을 사용하려면 프로필에 대한 솔루션을 구성해야 합니다. 자세한 내용은 방법: RIA Services에서 프로필 사용을 참조하십시오.

다음은 프로필을 구현한 경우 일반적으로 사용되는 메서드와 속성입니다.

멤버 사용할 코드 작업

User

WebContext.Current.User

User 클래스에 추가된 모든 속성을 포함하는 개체에 액세스합니다(예: User.PhoneNumber).

LoadUser

-또는-

LoadUser

WebContext.Current.Authentication.LoadUser()

-또는-

WebContext.Current.Authentication.LoadUser(LoadUserOperation, object)

사용자의 상태를 새로 고칩니다.

SaveUser

-또는-

SaveUser

WebContext.Current.Authentication.SaveUser(boolean)

-또는-

WebContext.Current.Authentication.SaveUser(SaveUserOperation, object)

사용자 상태의 변경 내용을 저장합니다(예: 프로필 속성 값 설정 후).

다음 예제에서는 사용자가 선택한 값을 기반으로 사용자 속성을 설정하는 방법을 보여 줍니다.

Private Sub OKButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles OKButton.Click
    Dim newSelection = Integer.Parse(defaultRows.SelectionBoxItem.ToString())
    If (newSelection <> WebContext.Current.User.DefaultRows) Then
        WebContext.Current.User.DefaultRows = newSelection
        WebContext.Current.Authentication.SaveUser(True)
    End If
    Me.DialogResult = True
End Sub
private void OKButton_Click(object sender, RoutedEventArgs e)
{
    int newSelection = int.Parse(defaultRows.SelectionBoxItem.ToString());
    if (newSelection != WebContext.Current.User.DefaultRows)
    {
        WebContext.Current.User.DefaultRows = newSelection;
        WebContext.Current.Authentication.SaveUser(true);
    }
    this.DialogResult = true;
}

클라이언트의 인증 오류 처리

메서드를 호출할 때 콜백 메서드를 매개 변수로 제공하여 사용자를 로그인, 로그아웃, 로드 또는 저장할 때 발생하는 오류를 처리할 수 있습니다. 콜백 메서드에서 코드를 추가하여 오류를 처리하고 MarkErrorAsHandled 메서드를 호출하여 프레임워크에서 예외를 throw하지 않도록 지정합니다. AuthenticationService 클래스를 사용하여 다음 메서드를 호출할 때 콜백 메서드를 제공할 수 있습니다.

  • LoadUser

  • Login

  • Logout

  • SaveUser

이전 "인증" 단원의 예제에서는 오류를 처리하는 Login 작업에 대한 콜백 메서드를 보여 줍니다.

자세한 내용은 클라이언트에서 오류 처리를 참조하십시오.

도메인 서비스에 대한 액세스 제한

인증과 역할을 구현한 후에는 도메인 서비스에 대한 액세스를 특정 사용자만으로 제한할 수 있습니다. 전체 도메인 서비스 또는 서비스의 개별 작업에 다음 특성을 적용합니다. 전체 서비스에 특성을 적용하면 특성이 모든 작업에 적용됩니다.

  • RequiresAuthenticationAttribute - 유효한 인증 자격 증명이 있는 사용자만 작업을 액세스할 수 있도록 지정합니다.

  • RequiresRoleAttribute - 지정된 역할에 속하는 인증된 사용자만 작업에 액세스할 수 있도록 지정합니다.

사용자 지정 권한 부여 특성을 직접 만들 수도 있습니다. 자세한 내용은 방법: 사용자 지정 권한 부여 특성 만들기를 참조하십시오.

다음 예제에서는 세 가지 도메인 작업을 포함하는 도메인 서비스를 보여 줍니다. RequiresAuthenticationAttributeRequiresRoleAttribute 특성은 액세스를 제한하는 데 사용됩니다. GetProducts 도메인 작업은 모든 사용자가 이용할 수 있고 GetSalesOrderHeaders는 인증된 사용자가 이용할 수 있으며 GetCustomers는 Managers 역할의 사용자만 이용할 수 있습니다.

<EnableClientAccess()>  _
Public Class AdventureWorksDomainService
    Inherits LinqToEntitiesDomainService(Of AdventureWorksLT_DataEntities)

    <RequiresRole("Managers")> _
    Public Function GetCustomers() As IQueryable(Of Customer)
        Return Me.ObjectContext.Customers
    End Function
    
    Public Function GetProducts() As IQueryable(Of Product)
        Return Me.ObjectContext.Products
    End Function

    <RequiresAuthentication()> _
    Public Function GetSalesOrderHeaders() As IQueryable(Of SalesOrderHeader)
        Return Me.ObjectContext.SalesOrderHeaders
    End Function
End Class
[EnableClientAccess()]
public class AdventureWorksDomainService : LinqToEntitiesDomainService<AdventureWorksLT_DataEntities>
{
    [RequiresRole("Managers")]
    public IQueryable<Customer> GetCustomers()
    {
        return this.ObjectContext.Customers;
    }
 
    public IQueryable<Product> GetProducts()
    {
        return this.ObjectContext.Products;
    }

    [RequiresAuthentication()]
    public IQueryable<SalesOrderHeader> GetSalesOrderHeaders()
    {
        return this.ObjectContext.SalesOrderHeaders;
    }
}

참고 항목

작업

연습: Silverlight 탐색 응용 프로그램에서 인증 서비스 사용
연습: Silverlight 비즈니스 응용 프로그램에서 인증 서비스 사용

개념

WCF RIA Services 보안