다음을 통해 공유


방법: ACS 관리 서비스를 사용하여 OpenID ID 공급자 구성

업데이트: 2015년 6월 19일

Azure에 적용합니다.

적용 대상

  • Microsoft® Azure™ Access Control Service (ACS)

  • OpenID 2.0

요약

이 항목에서는 OpenID 프로토콜을 지원하는 ID 공급자를 추가하기 위해 수행해야 하는 기본적인 단계에 대해 간략하게 설명합니다. 관리 서비스를 사용하여 ACS에 OpenID ID 공급자를 추가할 수 있습니다. ACS 관리 포털을 사용하여 OpenID ID 공급자를 추가할 수 없습니다. 이 항목에서는 ACS에서 지원하는 사양 버전이므로 OpenID 2.0 사양을 참조합니다.

콘텐츠

  • 목표

  • 개요

  • 단계 요약

  • 1단계 – 구성 정보 수집

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

  • 3단계 - 관리 서비스 클라이언트 구현

  • 4단계 – ID 공급자 추가

목표

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

  • OpenID ID 공급자를 추가하는 데 필요한 단계를 나열합니다.

개요

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

단계 요약

  • 1단계 – 구성 정보 수집

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

  • 3단계 - 관리 서비스 클라이언트 구현

  • 4단계 – ID 공급자 추가

1단계 – 구성 정보 수집

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

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

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

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

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

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

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

  • 서비스 네임스페이스

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

필요한 정보를 수집했으면 다음 단계를 수행하여 OpenID ID 공급자를 추가하기 위한 코드를 실행하는 샘플 콘솔 응용 프로그램을 만듭니다.

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

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

        static string serviceIdentityUsernameForManagement = "ManagementClient";
        static string serviceIdentityPasswordForManagement = "...update to your password...";

        static string serviceNamespace = "...update to your namespace...";
        static string acsHostName = "accesscontrol.windows.net";
        static string acsManagementServicesRelativeUrl = "v2/mgmt/service/";

        static string identityProviderName = "My Open ID Identity Provider";

        static string cachedSwtToken;

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 공급자 추가

이 단계에서는 앞서 만든 관리 서비스 클라이언트를 사용하여 OpenID ID 공급자를 추가합니다.

OpenID ID 공급자를 추가하려면

  1. Main 메서드 내에서 관리 서비스 클라이언트를 초기화합니다.

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

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

                var openId = new IdentityProvider
                {
                    DisplayName = identityProviderName,
                    Description = identityProviderName,
                    WebSSOProtocolType = "OpenId",
                    IssuerId = issuer.Id
                };
    
                svc.AddObject("IdentityProviders", openId);
    
  4. ID 공급자 로그인 주소를 업데이트합니다. 이 연습에서는 www.myopenid.com 로그인 주소로 사용합니다. 기타 OpenID ID 공급자로는 Google과 Yahoo!가 있으며, 이들 공급자에는 자체 로그인 주소가 있습니다. 각각과 https://www.google.com/accounts/o8/udhttps://open.login.yahooapis.com/openid/op/auth같습니다.

                var openIdAddress = new IdentityProviderAddress
                {
                    Address = "https://www.myopenid.com/server",
                    EndpointType = "SignIn"
                };
    
                svc.AddRelatedObject(openId, "IdentityProviderAddresses", openIdAddress);
                svc.SaveChanges();
    
  5. 관리 서비스를 제외한 신뢰 당사자가 ID 공급자를 사용할 수 있도록 만듭니다.

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