Windows Azure Active Directory를 이용한 ASP.NET 응용 프로그램 개발

등록일시: 2014-06-30 08:00,  수정일시: 2014-06-27 12:42
조회수: 5,274
이 문서는 ASP.NET Identity 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.

Windows Azure Active Directory에 관한 Microsoft의 ASP.NET 도구들을 이용하면 Windows Azure Web Sites 상에서 호스트되는 웹 응용 프로그램의 인증을 간단하게 활성화시킬 수 있습니다. Windows Azure Authentication을 사용해서 여러분이 속한 조직의 Office 365 사용자들이나, 온-프레미스(On-Premise) Active Directory와 동기화된 업무용 계정들, 또는 자체적인 사용자 지정 Windows Azure Active Directory 도메인에 생성된 사용자들을 인증할 수 있습니다. 단일 Windows Azure Active Directory 테넌트를 이용해서 사용자를 인증하려면, Windows Azure Authentication이 활성화되도록 응용 프로그램을 구성하면 됩니다.

본 자습서는 Bhavesh Chauhan과 Rick Anderson (@RickAndMSFT)에 의해서 작성되었습니다.

본문에서는 Windows Azure Active Directory에서 호스트되는 단일 조직 계정(Organizational Accounts)을 사용하도록 구성된 ASP.NET 응용 프로그램을 생성하는 과정을 살펴봅니다.

전제조건

  1. Visual Studio Express 2013 RC for Web 또는 Visual Studio 2013 RC *
  2. Windows Azure 계정. 여기에서 무료 계정을 발급받을 수 있습니다.

* 직접 본문의 예제를 테스트 해본 결과, 안타깝게도 Update 2가 설치된 Visual Studio Express 2013 for Web으로는 정상적인 결과를 얻지 못했습니다. 일단, Windows Azure에 응용 프로그램을 배포하는 과정에서도 문제가 발생했으며, 어렵게 배포를 마친 후로도 배포된 Azure Web Site에서 로그인을 테스트해보면 localhost로 재전송을 시도하는 상황이 발생했습니다. 반면, Update 2가 설치된 Visual Studio 2013으로는 한 번 만에 본문의 예제를 테스트 할 수 있었습니다. 이 점 참고하시기 바랍니다.

Active Directory 계정에 대한 전역 관리자 추가하기

  1. 먼저, Windows Azure Portal에 로그인합니다.
  2. Windows Azure Active Directory (AD) 계정을 선택하거나 생성합니다. 만약, 이미 Windows Azure AD 계정을 보유하고 있다면, 그 계정을 이용해도 무방합니다. 또는, Windows Azure AD 계정이 아직 없다면 생성합니다. 새로 Windows Azure를 구독한 분들은 기본 디렉터리(Default Directory)라는 AD 계정을 갖고 있을 것입니다.
  3. AD 계정에 전역 관리자 역할로 새로운 사용자를 생성합니다. AD 계정을 선택한 다음, 사용자 추가(Add User)를 클릭합니다. (보다 자세한 방법은 Managing Windows Azure AD from the Windows Azure Portal 1– Sign Up with an Organizational Account를 참고하시기 바랍니다.)
  4. 사용자 (계정) 이름을 입력하고 우하단의 화살표 버튼을 클릭합니다.
  5. 이번에는 사용자의 실제 성과 이름을 입력하고, 조직 내 역할을 전역 관리자(Global Administrator)로 설정합니다. 전역 관리자의 경우, 대체 전자 메일 주소(Alternate Email Address)도 입력해야 합니다. 그리고, 다시 우하단의 화살표 버튼을 클릭합니다.

    마지막으로, 만들기(Create) 버튼을 클릭합니다. 그리고, 임시 비밀번호는 별도로 복사해둡니다. 최초로 로그인할 때 이 비밀번호를 변경하게 될 것입니다.

ASP.NET 응용 프로그램 생성하기

  1. Visual Studio 2013에서 새로운 ASP.NET MVC 프로젝트를 생성합니다. 그리고, 인증 변경(Change Authentication) 버튼을 클릭합니다.
  2. 조직 계정(Organizational Accounts)을 선택합니다. 도메인 이름을 입력한 다음, Single Sign On, 디렉터리 데이터 읽기(Single Sign On, Read directory data) 옵션을 선택합니다. 확인(OK) 버튼을 클릭합니다.
    노트: 추가 옵션(More Options) 영역을 확장해서 영역(Realm, 응용 프로그램 ID URI)을 설정할 수도 있습니다. 이 응용 프로그램 ID URI 항목의 값은 프로젝트의 이름을 기반으로 https://<domainname>/<projectname> 형태로 자동 지정됩니다. 물론, 응용 프로그램 ID URI 항목에 자동을 지정된 값을 수정해서 규칙에 부합하는 응용 프로그램 ID URI를 지정할 수도 있습니다. 또는, Windows Azure portal을 이용해서 추가한 모든 사용자 지정 도메인에 대응하는 응용 프로그램 ID URI를 지정할 수도 있습니다. 그러나, 대부분의 사용자들은 기본 응용 프로그램 ID URI를 사용해도 별다른 문제가 없습니다.

    이 도구는 응용 프로그램의 권한을 설정하는 동안, 지정된 응용 프로그램 ID URI를 사용하는 기존 응용 프로그램을 찾고 반환 URL 같은 값들을 덮어 쓰게 됩니다. 동일한 ID URI를 사용하는 응용 프로그램 항목이 있는 경우 이를 덮어쓰기 옵션의 체크를 해제해서 항상 새로운 응용 프로그램을 생성하도록 지정할 수도 있습니다. 그러면, 이 도구가 자동으로 응용 프로그램 ID URI의 끝에 유일한 번호를 추가해서 기존 응용 프로그램과 충돌하지 않도록 보장해줍니다.
  3. 로그인 대화 상자가 나타나면 Active Directory의 전역 관리자 계정을 입력하고 이어지는 과정들을 완료합니다.
  4. 마지막으로 확인(OK) 버튼을 클릭해서 프로젝트를 생성합니다.
  5. 컨트롤+F5 키를 눌러서 프로젝트를 시작합니다. 그러면, IIS 익스프레스가 사용하는 인증서는 신뢰할 수 없는 인증서이기 때문에 브라우저가 SSL 인증서에 대한 경고를 출력할 것입니다. 일단 지금은 임시로 경고를 무시하고 작업을 계속하도록 합니다. 프로젝트를 Windows Azure에 배포하면 Windows Azure에서는 신뢰할 수 있는 인증서가 사용되기 때문에 경고가 나타나지 않을 것입니다.
  6. 본문에서 생성한 조직 계정을 사용해서 로그인합니다.
  7. 그러면, 로그인이 정상적으로 완료되는 것을 확인할 수 있습니다.

Windows Azure에 응용 프로그램 배포하기

  1. 이번에는 Windows Azure Portal에서 응용 프로그램을 배포할, 데이터베이스를 갖고 있는 새로운 Web Site를 생성해야 합니다. 좌측 패인에서 웹 사이트(Web Sites)를 클릭한 다음, 새로 만들기(New) 버튼을 클릭합니다.
  2. 사용자 지정 만들기(Custom Create)를 클릭합니다.
  3. 이제 Windows Azure에 응용 프로그램을 배포해야 합니다. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭한 다음, 게시(Publish)를 선택합니다.
  4. 설정(Settings) 단계에서, 조직 인증 사용 옵션이 체크되어 있고, 엑세스 수준이 디렉터리 데이터 읽기로 설정되어 있다는 점에 주목하시기 바랍니다. 데이터베이스 영역에서 데이터베이스에 대한 연결 문자열을 설정할 수도 있습니다.
  5. 배포가 완료되고 나면 Windows Azure 웹 사이트를 방문해서, 본 자습서에서 생성한 계정으로 로그인을 시도해봅니다. 이번에는 인증서 관련 경고가 나타나지 않을 것입니다. *

* 반드시 HTTPS 프로토콜을 사용해서 접근해야만 합니다. 만약, HTTP 프로토콜을 이용해서 테스트 사이트에 접근하면 오류가 발생하는데, Web.config의 설정에 따라 원격 접속 사용자에게는 상세한 오류 정보가 출력되지 않기 때문에 당황할 수 있으므로 주의하시기 바랍니다.

Graph API를 이용해서 사용자 프로필 정보 읽기

조직 계정을 지원하기 위한 Visual Studio의 템플릿에서는 UserProfile 액션 메서드와 뷰를 추가해줍니다.

[Authorize]
public async Task<ActionResult> UserProfile()
{
    string tenantId = ClaimsPrincipal.Current.FindFirst(TenantSchema).Value;

    // Get a token for calling the Windows Azure Active Directory Graph
    AuthenticationContext authContext = new AuthenticationContext(String.Format(CultureInfo.InvariantCulture, LoginUrl, tenantId));
    ClientCredential credential = new ClientCredential(AppPrincipalId, AppKey);
    AuthenticationResult assertionCredential = authContext.AcquireToken(GraphUrl, credential);
    string authHeader = assertionCredential.CreateAuthorizationHeader();
    string requestUrl = String.Format(
        CultureInfo.InvariantCulture,
        GraphUserUrl,
        HttpUtility.UrlEncode(tenantId),
        HttpUtility.UrlEncode(User.Identity.Name));

    HttpClient client = new HttpClient();
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
    request.Headers.TryAddWithoutValidation("Authorization", authHeader);
    HttpResponseMessage response = await client.SendAsync(request);
    string responseString = await response.Content.ReadAsStringAsync();
    UserProfile profile = JsonConvert.DeserializeObject<UserProfile>(responseString);

    return View(profile);
}

화면 상단의 네비게이션 바에서 UserProfile 링크를 클릭해보면 로그인 한 사용자에 대한 프로필 데이터를 확인할 수 있습니다. *

* Update 2가 설치된 Visual Studio 2013에서 제공되는 MVC 템플릿에는 UserProfile 링크가 존재하지 않습니다. 대신, 로그인한 사용자의 이름을 클릭해보면 동일한 화면을 확인할 수 있습니다.

추가 정보