방법: ACS 관리 서비스를 사용하여 AD FS 2.0을 Enterprise ID 공급자로 구성

업데이트: 2015년 6월 19일

Azure에 적용합니다.

적용 대상

  • Microsoft® Azure™ Access Control Service (ACS)

  • Microsoft AD FS(Active Directory® Federation Services) 2.0

요약

이 항목에서는 네임스페이스 또는 신뢰 당사자 애플리케이션에 ID 공급자를 추가하는 방법을 설명합니다. 이 작업을 수행하려면 ACS 관리 서비스를 사용할 수 있습니다. 관리 서비스는 ACS를 관리하기 위한 사용자 지정 사용자 인터페이스를 빌드하고 다중 테넌트 SaaS(Software as a Service) 솔루션에 대한 새 테넌트 추가를 자동화할 때 특히 유용합니다.

콘텐츠

  • 목표

  • 개요

  • 단계 요약

  • 1단계 – 구성 정보 수집

  • 2단계 – 필수 서비스 및 어셈블리에 대한 참조 추가

  • 3단계 – 관리 서비스 프록시 구현

  • 4단계 – ID 공급자 추가

  • 5단계 – 작업 테스트

목표

  • 요구 사항 및 구성 정보를 식별합니다.

  • 필요한 단계를 나열합니다.

  • 구성이 성공적인지 확인합니다.

개요

ACS 관리 서비스는 코드에 ACS 기능을 노출하는 웹 서비스입니다. ACS 관리 서비스는 ACS 관리 포털 사용자 인터페이스에서 사용할 수 있는 기능 하위 집합을 포함하여 모든 ACS 기능에 액세스할 수 있습니다.

MICROSOFT를 ID 공급자로 ACS에 추가하면 클라우드 기반 솔루션에 대한 회사 ID 관리에 대한 투자를 다시 사용할 수 있습니다. ID 공급자로 구성하려면 특정 단계를 따르는 코드를 작성해야 합니다. 이 항목에서는 이러한 기본적인 단계에 대해 간략하게 설명합니다.

단계 요약

  • 1단계 – 구성 정보 수집

  • 2단계 – 필수 서비스 및 어셈블리에 대한 참조 추가

  • 3단계 – 관리 서비스 프록시 구현

  • 4단계 – ID 공급자 추가

  • 5단계 – 작업 테스트

1단계 – 구성 정보 수집

이 단계에서는 필요한 구성 정보를 수집하는 방법에 대해 설명합니다. 수집해야 하는 정보는 다음과 같습니다.

  • 관리 서비스 ID 사용자 이름. 기본값은 ManagementClient입니다.

  • 관리 서비스 ID 사용자 암호.

  • 네임스페이스 이름입니다.

  • ACS 호스트 이름: accesscontrol.windows.net

  • 서명 인증서 문자열: 배포에서 AD FS 서명 인증서 문자열을 가져옵니다.

관리 서비스 ID 사용자 이름 및 암호를 찾으려면 다음 절차를 따릅니다.

  1. Microsoft Azure 관리 포털(https://manage.WindowsAzure.com)로 이동하여 로그인한 다음 Active Directory를 클릭합니다. (문제 해결 팁: "Active Directory" 항목이 없거나 사용할 수 없음) Access Control 네임스페이스를 관리하려면 네임스페이스를 선택한 다음 관리를 클릭합니다. 또는 Access Control 네임스페이스를 클릭하고 네임스페이스를 선택한 다음 관리를 클릭합니다.

  2. 관리 서비스를 클릭한 후 관리 서비스를 선택합니다(예: ManagementClient).

  3. 이름 필드의 값은 관리 서비스 ID 사용자 이름입니다.

  4. 자격 증명 섹션에서 암호를 클릭합니다. 암호 필드의 값은 관리 서비스 ID 암호입니다.

필요한 정보를 수집한 후 다음 단계에 따라 ID 공급자로 추가할 코드를 실행하는 샘플 콘솔 애플리케이션을 만듭니다.

  1. Visual Studio 시작하고 새 콘솔 애플리케이션 프로젝트를 만듭니다.

  2. Program 클래스에서 모듈 범위가 있는 변수에 구성 정보 값을 할당합니다. 다음 코드 샘플은 이 작업의 수행 방법을 보여 줍니다.

    static string serviceIdentityUsernameForManagement = "ManagementClient";
    static string serviceIdentityPasswordForManagement = "ManagementClientPasswordValue";
    
    static string serviceNamespace = "MyNameSpaceNoDots";
    static string acsHostName = "accesscontrol.windows.net";
    
    static string signingCertificate = "Very long string representing ADFS signing certificate";
    
    static string cachedSwtToken;
    static string identityProviderName = "My Other ADFS Identity Provider";
    

2단계 – 필수 서비스 및 어셈블리에 대한 참조 추가

이 단계에서는 서비스와 어셈블리에 대한 필수 종속성을 식별 및 추가합니다.

서비스 및 어셈블리에 대한 필수 종속성을 추가하려면

  1. System.Web.Extensions에 대한 참조를 추가합니다.

  2. 관리 서비스에 대한 서비스 참조를 추가합니다. 관리 서비스 URL은 네임스페이스에 고유하며, 다음과 같습니다.

    https:// YOURNAMESPACE.accesscontrol.windows.net/v2/mgmt/service

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

    using System.Web; 
    using System.Net; 
    using System.Data.Services.Client; 
    using System.Collections.Specialized; 
    using System.Web.Script.Serialization;
    

3단계 – 관리 서비스 프록시 구현

이 단계에서는 관리 서비스 프록시 구현을 캡슐화하는 메서드를 만듭니다.

관리 서비스 프록시를 구현하려면

  1. Program 클래스에 다음 메서드를 추가합니다.

    public static ManagementService CreateManagementServiceClient()
            {
                string managementServiceHead = "v2/mgmt/service/";
                string managementServiceEndpoint = 
    string.Format("https://{0}.{1}/{2}", 
    serviceNamespace, 
    acsHostName, 
    managementServiceHead);
                ManagementService managementService = 
    new ManagementService(new Uri(managementServiceEndpoint));
    
                managementService.SendingRequest += GetTokenWithWritePermission;
    
                return managementService;
            }
    
  2. GetTokenWithWritePermission 메서드와 해당 도우미 메서드를 구현합니다. 그러면 HTTP 요청의 Authorization 헤더에 SWT OAuth 토큰이 추가됩니다.

            public static void GetTokenWithWritePermission(object sender, 
    SendingRequestEventArgs args)
            {
                GetTokenWithWritePermission((HttpWebRequest)args.Request);
            }
    
            public static void GetTokenWithWritePermission(HttpWebRequest args)
            {
                if (cachedSwtToken == null)
                {
                    cachedSwtToken = GetTokenFromACS();
                }
    
                args.Headers.Add(HttpRequestHeader.Authorization, 
     string.Format("OAuth {0}", 
     cachedSwtToken));
            }
    
            private static string GetTokenFromACS()
            {
                // request a token from ACS
                WebClient client = new WebClient();
                client.BaseAddress = string.Format("https://{0}.{1}", 
          serviceNamespace, 
          acsHostName);
    
                NameValueCollection values = new NameValueCollection();
    
                values.Add("grant_type", "password");
                values.Add("client_id", serviceIdentityUsernameForManagement);
                values.Add("username", serviceIdentityUsernameForManagement);
                values.Add("client_secret", serviceIdentityPasswordForManagement);
                values.Add("password", serviceIdentityPasswordForManagement);
    
                byte[] responseBytes = 
    client.UploadValues("/v2/OAuth2-13/rp/AccessControlManagement", 
          "POST", 
          values);
    
                string response = Encoding.UTF8.GetString(responseBytes);
    
                // Parse the JSON response and return the access token 
                JavaScriptSerializer serializer = new JavaScriptSerializer();
    
                Dictionary<string, object> decodedDictionary = 
    serializer.DeserializeObject(response) as Dictionary<string, object>;
    
                return decodedDictionary["access_token"] as string;
    
            }
    

4단계 – ID 공급자 추가

이 단계는 이전에 만든 관리 서비스 프록시를 사용하여 ID 공급자로 추가됩니다.

AD FS 2.0을 ID 공급자로 추가하려면

  1. 관리 서비스 프록시를 초기화합니다.

    ManagementService svc = CreateManagementServiceClient();
    
  2. ID 공급자를 발급자로 추가합니다.

    Issuer issuer = new Issuer
           {
           Name = identityProviderName
    };
           svc.AddToIssuers(issuer);
           svc.SaveChanges(SaveChangesOptions.Batch);
    
  3. ID 공급자를 만듭니다.

    IdentityProvider identityProvider = new IdentityProvider()
    {
        DisplayName = identityProviderName,
        Description = identityProviderName,
        WebSSOProtocolType = "WsFederation",
        IssuerId = issuer.Id
    };
           svc.AddObject("IdentityProviders", identityProvider);
    
  4. 앞서 얻은 인증서를 기반으로 ID 공급자 서명 키를 만듭니다.

    IdentityProviderKey identityProviderKey = new IdentityProviderKey()
    {
        DisplayName = "SampleIdentityProviderKeyDisplayName",
        Type = "X509Certificate",
        Usage = "Signing",
        Value = Convert.FromBase64String(signingCertificate),
        IdentityProvider = identityProvider,
        StartDate = startDate,
        EndDate = endDate,
    };
          svc.AddRelatedObject(identityProvider, 
    "IdentityProviderKeys", 
    identityProviderKey);
    
  5. ID 공급자 로그인 주소를 업데이트합니다.

    IdentityProviderAddress realm = new IdentityProviderAddress()
    {
        Address = "http://SampleIdentityProvider.com/sign-in/",
        EndpointType = "SignIn",
        IdentityProvider = identityProvider,
    };
    svc.AddRelatedObject(identityProvider, "IdentityProviderAddresses", realm);
    
    svc.SaveChanges(SaveChangesOptions.Batch);
    
  6. 관리 서비스를 제외한 신뢰 당사자가 ID 공급자를 사용할 수 있도록 만듭니다.

    foreach (RelyingParty rp in svc.RelyingParties)
    {
        // skip the built-in management RP. 
        if (rp.Name != "AccessControlManagement")
        {
            svc.AddToRelyingPartyIdentityProviders(new RelyingPartyIdentityProvider()
            {
                IdentityProviderId = identityProvider.Id,
                RelyingPartyId = rp.Id
            });
        }
    }
    
    svc.SaveChanges(SaveChangesOptions.Batch);
    

5단계 – 작업 테스트

작업을 테스트하려면

  1. 액세스 제어 서비스 페이지의 신뢰 관계 섹션에서 규칙 그룹 링크를 클릭합니다.

  2. 사용 가능한 규칙 중 아무 규칙이나 클릭합니다.

  3. 규칙 그룹 편집 페이지에서 규칙 추가 링크를 클릭합니다.

  4. 클레임 규칙 추가 페이지의 클레임 발급자 섹션 드롭다운 목록에서 새로 추가된 ID 공급자를 선택합니다.

  5. 나머지 기본값은 그대로 둡니다.

  6. 저장을 클릭합니다.

ID 공급자에 대한 통과 규칙이 만들어졌습니다.