방법: ACS 관리 서비스를 사용하여 Facebook을 인터넷 ID 공급자로 구성

업데이트: 2015년 6월 19일

Azure에 적용합니다.

적용 대상

  • Microsoft® Azure™ Access Control Service (ACS)

  • Facebook

요약

이 항목에서는 Facebook을 ID 공급자로 추가하기 위해 수행해야 하는 기본적인 단계에 대해 간략하게 설명합니다. Facebook은 관리 포털을 사용하여 ACS에 ID 공급자로 추가하거나 ACS 관리 서비스를 사용하여 자동화할 수 있습니다. 예를 들어 ACS를 관리하기 위한 사용자 지정 사용자 인터페이스를 빌드하거나 다중 테넌트 SaaS(Software as a Service) 솔루션에 대한 새 테넌트의 온보딩을 자동화하는 시나리오에서 관리 서비스를 사용하는 것이 유용합니다.

콘텐츠

  • 목표

  • 개요

  • 단계 요약

  • 1단계 – 구성 정보 수집

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

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

  • 4단계 – ID 공급자 추가

  • 5단계 – 작업 테스트

목표

  • 필수 구성 요소 및 구성 정보를 식별합니다.

  • Facebook을 ID 공급자로 추가하기 위해 수행해야 하는 단계를 제시합니다.

  • 구성이 성공적인지 테스트합니다.

개요

관리 서비스는 ACS의 주요 구성 요소 중 하나인 웹 서비스입니다. 관리 포털 사용자 인터페이스를 통해 사용 가능한 기능을 제공합니다. 관리 포털에서 수행할 수 있는 작업은 관리 서비스를 통해서도 수행할 수 있습니다. FACEBOOK을 ID 공급자로 ACS에 추가하면 인터넷 규모의 ID 관리 메커니즘을 개발하고 유지 관리할 수 있습니다. Facebook을 ID 공급자로 구성하는 작업을 수행하려면 특정 단계가 뒤따르는 코드를 작성해야 합니다. 이 항목에서는 이러한 기본적인 단계에 대해 간략하게 설명합니다.

단계 요약

  • 1단계 – 구성 정보 수집

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

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

  • 4단계 – ID 공급자 추가

  • 5단계 – 작업 테스트

1단계 – 구성 정보 수집

이 단계에서는 필수 구성 정보를 수집하는 방법을 식별 및 제시합니다. 수집해야 하는 정보는 다음과 같습니다.

  • 관리 서비스 ID 사용자 이름 - ManagementClient

  • 관리 서비스 ID 암호 - 관리 서비스용 서비스 ID 암호를 얻으려면 다음을 수행합니다.

    1. 액세스 제어 서비스 관리 포털에 로그온합니다.

    2. 관리 섹션에서 관리 서비스 링크를 클릭합니다.

    3. 관리 서비스 페이지에서 ManagementClient 링크(ManagementClient는 서비스의 실제 사용자 이름임)를 클릭합니다.

    4. 자격 증명 섹션에서 대칭 키암호 링크를 클릭합니다. 각 링크의 값은 동일하며, 해당 값이 암호입니다.

  • 서비스 네임스페이스

  • ACS 호스트 이름 - 일반적으로 accesscontrol.windows.net.

  • Facebook 애플리케이션 ID 및 애플리케이션 비밀 - 방법: Facebook을 ID 공급자로 구성의 지침을 따릅니다.

필수 정보를 수집한 후에는 다음 단계에 따라 Facebook을 ID 공급자로 추가하는 코드를 실행할 샘플 콘솔 응용 프로그램을 만듭니다.

  1. Visual Studio® 2010을 열고 새 콘솔 응용 프로그램 프로젝트를 만듭니다.

  2. Program 클래스에서 다음과 같은 코드를 사용하여 앞서 수집한 정보를 모듈 범위 변수에 할당합니다.

static string serviceIdentityUsernameForManagement = "ManagementClient";
static string serviceIdentityPasswordForManagement = "My Password for my ManagementClient";

static string serviceNamespace = "MyNameSpaceNoDots";
static string acsHostName = "accesscontrol.windows.net";
static string acsManagementServicesRelativeUrl = "v2/mgmt/service/";


static string cachedSwtToken;
static string identityProviderName = "Facebook";

static string facebookAppId = "Your Facebook AppID";
static string facebookAppSecret = "Your Facebook Secret";

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;
    using System.Globalization;
    using System.Runtime.Serialization.Json;
    using ConsoleApplication1.ServiceReference1;
    

마지막 선언인 ConsoleApplication1.ServiceReference1에 주의합니다. 콘솔 응용 프로그램을 만들 때 기본값을 변경했거나 관리 서비스에 대한 참조를 추가한 경우에는 이 선언이 달라질 수 있습니다.

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

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

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

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

    public static ManagementService CreateManagementServiceClient()
            {
                string managementServiceEndpoint = String.Format(CultureInfo.InvariantCulture, "https://{0}.{1}/{2}",
                    serviceNamespace,
                    acsHostName,
                    acsManagementServicesRelativeUrl);
                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, "Bearer " + cachedSwtToken);
            }
    
            private static string GetTokenFromACS()
            {
                //
                // Request a token from ACS
                //
                WebClient client = new WebClient();
                client.BaseAddress = string.Format(CultureInfo.CurrentCulture, 
                                                   "https://{0}.{1}", 
                                                   serviceNamespace, 
                                                   acsHostName);
    
                NameValueCollection values = new NameValueCollection();
                values.Add("grant_type", "client_credentials");
                values.Add("client_id", serviceIdentityUsernameForManagement);
                values.Add("client_secret", serviceIdentityPasswordForManagement);
                values.Add("scope", client.BaseAddress + acsManagementServicesRelativeUrl);
    
                byte[] responseBytes = client.UploadValues("/v2/OAuth2-13", "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 공급자 추가

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

Facebook을 ID 공급자로 추가하려면

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

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

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

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

    var facebookKeys = new[]
        {
            new IdentityProviderKey
                {
                    IdentityProvider = facebook,
                    StartDate = DateTime.UtcNow,
                    EndDate = DateTime.UtcNow.AddYears(1),
                    Type = "ApplicationKey",
                    Usage = "ApplicationId",
                    Value = Encoding.UTF8.GetBytes(facebookAppId)
                },
            new IdentityProviderKey
                {
                    IdentityProvider = facebook,
                    StartDate = DateTime.UtcNow,
                    EndDate = DateTime.UtcNow.AddYears(1),
                    Type = "ApplicationKey",
                    Usage = "ApplicationSecret",
                    Value = Encoding.UTF8.GetBytes(facebookAppSecret)
                }
        };
    
    foreach (var key in facebookKeys)
    {
        svc.AddRelatedObject(facebook, "IdentityProviderKeys", key);
    }
    
    svc.SaveChanges(SaveChangesOptions.Batch);
    
  5. 관리 서비스를 제외한 신뢰 당사자가 ID 공급자를 사용할 수 있도록 만듭니다.

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

5단계 – 작업 테스트

작업을 테스트하려면

  1. 액세스 제어 서비스 관리 포털에 로그온합니다.

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

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

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

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

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

  7. 저장을 클릭합니다.

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