다음을 통해 공유


방법: WIF 및 ACS를 사용하여 클레임 인식 ASP.NET 애플리케이션에서 클레임 권한 부여 구현

업데이트: 2015년 6월 19일

Azure에 적용합니다.

적용 대상

  • Microsoft® Azure™ Access Control Service (ACS)

  • WIF(Windows® Identity Foundation)

  • ASP.NET

요약

이 항목에서는 WIF 및 ACS를 사용하여 클레임 인식 ASP.NET 웹 애플리케이션에서 CBAC(클레임 기반 Access Control) 권한 부여를 구현하는 방법에 대해 설명합니다.

콘텐츠

  • 목표

  • 개요

  • 단계 요약

  • 1단계 – 클레임 권한 부여 라이브러리 구현

  • 2단계 – 클레임 권한 부여 라이브러리를 사용하도록 ASP.NET 응용 프로그램 구성

  • 3단계 – 권한 부여 정책 구성

  • 관련 항목

목표

  • 응용 프로그램에서 권한 부여 논리를 외부화합니다.

  • 권한 부여를 보다 상세하게 제어할 수 있도록 역할 범위를 초과하여 권한 부여 확인을 구현합니다.

  • 정책 기반의 선언적 권한 부여 관리 기능을 제공합니다.

개요

클레임 권한 부여에서는 토큰 내에 포함되어 전달되는 정보인 클레임을 사용합니다. 역할만을 기반으로 권한 부여 관련 결정을 내리기에는 정보가 부족한 경우 클레임 권한 부여를 사용하면 유용합니다. 예를 들어 재무 응용 프로그램에서는 재직 기간 및 기타 특성을 기반으로 계좌 간의 서로 다른 자금 이체 한도에 동일한 역할을 지정할 수 있습니다. 이러한 특성은 역할이 포함된 클레임 형식일 수 있으므로, 권한 부여와 관련하여 보다 세부적인 결정을 내릴 수 있습니다.

단계 요약

  • 1단계 – 클레임 권한 부여 라이브러리 구현

  • 2단계 – 클레임 권한 부여 라이브러리를 사용하도록 ASP.NET 응용 프로그램 구성

  • 3단계 – 권한 부여 정책 구성

1단계 – 클레임 권한 부여 라이브러리 구현

이 단계에서는 구성 파일에서 액세스 정책을 읽고 액세스 확인을 적용하는 외부 클래스 라이브러리를 만드는 방법을 보여 줍니다. 다음 샘플에서는 우편 번호 클레임을 기반으로 권한 부여 관련 결정을 내리는 클레임 권한 부여 라이브러리를 구현하는 방법을 보여 줍니다.

클레임 권한 부여 라이브러리를 구현하려면

  1. Visual Studio®가 관리자 모드에서 실행되고 있는지 확인합니다.

  2. 솔루션 탐색기에서 원하는 솔루션을 마우스 오른쪽 단추로 클릭하고 새 Class Library 프로젝트를 추가한 후 이 프로젝트에 이름을 지정합니다(예: MyClaimsAuthorizationManager).

  3. 기본 클래스인 Class1.cs를 삭제합니다.

  4. 새 클래스를 추가하고 이 클래스에 이름을 지정합니다(예: ZipClaimsAuthorizationManager). 그러면 우편 번호를 기반으로 권한 부여가 구현됩니다.

  5. Microsoft.IdentityModelSystem.Web 어셈블리에 대한 참조를 추가합니다.

  6. 다음 선언을 추가합니다.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. ClaimsAuthorizationManager 클래스를 확장하여 해당 AccessCheck 메서드를 재정의하고 ZipClaimsAuthorizationManager 클래스에 대해 생성자를 구현합니다. 그러면 코드가 다음과 같이 표시됩니다.

    namespace MyClaimsAuthorizationManager 
    { 
        class ZipClaimsAuthorizationManager : ClaimsAuthorizationManager 
        { 
            private static Dictionary<string, int> m_policies = new Dictionary<string, int>(); 
    
            public ZipClaimsAuthorizationManager(object config) 
            { 
                XmlNodeList nodes = config as XmlNodeList; 
                foreach (XmlNode node in nodes) 
                { 
                    { 
                        //FIND ZIP CLAIM IN THE POLICY IN WEB.CONFIG AND GET ITS VALUE 
                        //ADD THE VALUE TO MODULE SCOPE m_policies 
                        XmlTextReader reader = new XmlTextReader(new StringReader(node.OuterXml)); 
                        reader.MoveToContent(); 
                        string resource = reader.GetAttribute("resource"); 
                        reader.Read(); 
                        string claimType = reader.GetAttribute("claimType"); 
                        if (claimType.CompareTo(ClaimTypes.PostalCode) == 0) 
                        { 
                            throw new ArgumentNullException("Zip Authorization is not specified in policy in web.config"); 
                        } 
                        int zip = -1; 
                        bool success = int.TryParse(reader.GetAttribute("Zip"),out zip); 
                        if (!success) 
                        { 
                            throw new ArgumentException("Specified Zip code is invalid - check your web.config"); 
                        } 
                        m_policies[resource] = zip; 
                    } 
                } 
            } 
            public override bool CheckAccess(AuthorizationContext context) 
            { 
                //GET THE IDENTITY 
                //FIND THE POSTALCODE CLAIM'S VALUE IN IT 
                //COMPARE WITH THE POLICY 
                int allowedZip = -1; 
                int requestedZip = -1; 
                Uri webPage = new Uri(context.Resource.First().Value); 
                IClaimsPrincipal principal = (IClaimsPrincipal)HttpContext.Current.User; 
                if (principal == null) 
                { 
                    throw new InvalidOperationException("Principal is not populate in the context - check configuration"); 
                } 
                IClaimsIdentity identity = (IClaimsIdentity)principal.Identity; 
                if (m_policies.ContainsKey(webPage.PathAndQuery)) 
                { 
                    allowedZip = m_policies[webPage.PathAndQuery]; 
                    requestedZip = -1; 
                    int.TryParse((from c in identity.Claims 
                                            where c.ClaimType == ClaimTypes.PostalCode 
                                            select c.Value).FirstOrDefault(), out requestedZip); 
                } 
                if (requestedZip!=allowedZip) 
                { 
                    return false; 
                } 
                return true; 
            } 
        } 
    }
    
  8. 솔루션을 컴파일하여 컴파일 오류가 없는지 확인합니다.

  9. 컴파일된 라이브러리를 찾습니다(여기에서는 MyClaimsAuthorizationManager.dll). ASP.NET 웹 응용 프로그램의 bin 폴더에 이 라이브러리를 저장해야 합니다.

2단계 – 클레임 권한 부여 라이브러리를 사용하도록 ASP.NET 응용 프로그램 구성

다음 단계는 ASP.NET 웹 응용 프로그램에서 수행됩니다. 이전 단계에서 만든 클레임 권한 부여 관리자 라이브러리에 대한 참조를 추가하지 마세요. ASP.NET 웹 응용 프로그램은 web.config가 아닌 다른 위치에서는 해당 라이브러리를 인식해서는 안 됩니다.

클레임 권한 부여 라이브러리를 사용하도록 ASAP.NET 응용 프로그램을 구성하려면

  1. web.config의 HttpModules 섹션에 다음 항목을 추가하여 파이프라인에 WIF ClaimsAuthorizationModule을 포함하도록 ASP.NET 웹 응용 프로그램을 구성합니다. 이는 Visual Studio와 함께 제공되는 개발 웹 서버에 해당되며, IIS(Internet Information Services) 버전 7의 경우에는 system.webServer 노드 아래의 modules 섹션에서 이 구성을 찾아야 합니다.

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. microsoft.identityModel.service 노드에 다음 항목을 추가하여 이전 단계에서 구현한 사용자 지정 권한 부여 라이브러리를 사용하도록 ASP.NET 웹 응용 프로그램을 구성합니다.

    <claimsAuthorizationManager type="MyClaimsAuthorizationManager.ZipClaimsAuthorizationManager, MyClaimsAuthorizationManager" >
    

3단계 – 권한 부여 정책 구성

이 항목에서 구성 정책은 ASP.NET 웹 응용 프로그램 web.config 파일로 표현됩니다. 이 정책은 리소스를 클레임 유형 및 해당 값에 매핑하는 간단한 규칙을 전달합니다. 예를 들어 이전 단계에서 만들고 구현한 사용자 지정 권한 부여 라이브러리는 다음 정책을 읽고 적용할 수 있습니다. 이전 단계에서 구성한 calimsAuthorizationManager 노드에 다음 항목을 추가합니다.

<policy resource="/default.aspx">
  <claim claimType=https://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode
  Zip="11111" />
</policy>

위 정책의 경우 default.aspx 페이지에 액세스하려면 들어오는 토큰에 값이 11111인 우편 번호 클레임이 있어야 합니다.