AD FS 2016 이상에서 OAuth 공용 클라이언트를 사용하여 네이티브 클라이언트 애플리케이션 빌드

개요

이 문서에서는 AD FS 2016 이상으로 보호되는 Web API와 상호 작용하는 네이티브 애플리케이션을 빌드하는 방법을 보여줍니다.

  1. .Net TodoListClient WPF 애플리케이션은 ADAL(Active Directory 인증 라이브러리)을 사용하여 OAuth 2.0 프로토콜을 통해 Azure Active Directory(Azure AD)에서 JWT 액세스 토큰을 얻습니다.
  2. 액세스 토큰은 TodoListService 웹 API의 /todolist 엔드포인트를 호출할 때 사용자를 인증하기 위한 bearer 토큰으로 사용됩니다. 여기서는 Azure AD에 대한 애플리케이션 예제를 사용한 다음, AD FS 2016 이상에 맞게 수정합니다.

Application overivew

필수 구성 요소

이 문서를 완료 하기 전에 필요한 필수 구성 요소 목록은 다음과 같습니다. 이 문서는 AD FS 설치 되어 있고 AD FS 팜에 만들어진 가정 합니다.

  • GitHub 클라이언트 도구
  • Windows Server 2016 이상에서 AD FS
  • Visual Studio 2013 이상

샘플 연습 만들기

AD FS 애플리케이션 그룹 만들기

  1. AD FS 관리에서 애플리케이션 그룹을 마우스 오른쪽 단추로 클릭하고 애플리케이션 그룹 추가를 선택합니다.

  2. 애플리케이션 그룹 마법사에서 이름에 원하는 이름(예: NativeToDoListAppGroup)을 입력합니다. 웹 API 템플릿 에 액세스하는 네이티브 애플리케이션을 선택합니다. 다음을 클릭합니다. Add application group

  3. 네이티브 애플리케이션 페이지에서 AD FS 생성된 식별자를 확인합니다. AD FS 공용 클라이언트 앱을 인식하는 ID입니다. 복사는 클라이언트 식별자 값입니다. 나중에 애플리케이션 코드에서 ida:ClientId의 값으로 사용됩니다. 원하는 경우 여기에서 사용자 지정 식별자를 제공할 수 있습니다. 리디렉션 URI는 임의의 값입니다(예: put). https://ToDoListClienthttps://ToDoListClient

  4. Web API 구성 페이지에서 Web API의 식별자 값을 설정합니다. 이 예제에서는 웹앱이 실행되어야 하는 SSL URL 값이어야 합니다. 솔루션에서 TooListServer 프로젝트의 속성을 클릭하여 이 값을 얻을 수 있습니다. 나중에 네이티브 클라이언트 애플리케이션의 App.config 파일에서 todo:TodoListResourceId 값으로 사용되며 todo:TodoListBaseAddress로도사용됩니다. Web API

  5. 기본값을 적용하여 Access Control 정책 적용 및 애플리케이션 권한 구성을 진행합니다. 요약 페이지는 다음과 같습니다. Summary

다음을 클릭한 다음 마법사를 완료합니다.

발급된 클레임 목록에 NameIdentifier 클레임 추가

데모 애플리케이션은 다양한 위치에 있는 NameIdentifier 클레임의 값을 사용합니다. Azure AD와 달리 AD FS 기본적으로 NameIdentifier 클레임을 발급하지 않습니다. 따라서 애플리케이션이 올바른 값을 사용할 수 있도록 NameIdentifier 클레임을 발급하는 클레임 규칙을 추가해야 합니다. 이 예제에서는 지정된 사용자 이름이 토큰의 사용자에 대한 NameIdentifier 값으로 발급됩니다. 클레임 규칙을 구성하려면 방금 만든 애플리케이션 그룹을 열고 Web API를 두 번 클릭합니다. 발급 변환 규칙 탭을 선택한 다음 규칙 추가 단추를 클릭합니다. 클레임 규칙 유형에서 사용자 지정 클레임 규칙을 선택한 다음, 아래와 같이 클레임 규칙을 추가합니다.

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
 => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"), query = ";givenName;{0}", param = c.Value);

NameIdentifier claim rule

애플리케이션 코드 수정

이 섹션에서는 웹 API 샘플을 다운로드 하 고 Visual Studio에서 수정 하는 방법을 설명 합니다. Azure AD 된 샘플을 사용 합니다 여기합니다.

샘플 프로젝트를 다운로드 하려면 Git Bash를 사용 하 고 다음을 입력 합니다.

git clone https://github.com/Azure-Samples/active-directory-dotnet-native-desktop

ToDoListClient 수정

솔루션의 이 프로젝트는 네이티브 클라이언트 애플리케이션을 나타냅니다. 클라이언트 애플리케이션에서 다음을 알고 있는지 확인해야 합니다.

  1. 필요할 때 사용자를 인증하려면 어디로 이동해야 할까요?
  2. 클라이언트가 인증 기관(AD FS)에 제공해야 하는 ID는 무엇인가요?
  3. 액세스 토큰을 요청하는 리소스의 ID는 무엇인가요?
  4. Web API의 기본 주소는 무엇인가요?

위의 정보를 네이티브 클라이언트 애플리케이션으로 얻으려면 다음 코드를 변경해야 합니다.

App.config

  • AD FS 서비스를 설명하는 값으로 키 ida:Authority를 추가합니다. 예를 들어 https://fs.contoso.com/adfs/

  • AD FS 애플리케이션 그룹을 만드는 동안 네이티브 애플리케이션 페이지의 클라이언트 식별자 값으로 ida:ClientId 키를 수정합니다. 예: 3f07368b-6efd-4f50-a330-d93853f4c855

  • AD FS 애플리케이션 그룹을 만드는 동안 Web API 구성 페이지의 식별자 값으로 todo:todo:TodoListResourceId를 수정합니다. 예를 들어 https://localhost:44321/

  • AD FS 애플리케이션 그룹을 만드는 동안 Web API 구성 페이지의 식별자 값으로 todo:TodoListBaseAddress를 수정합니다. 예를 들어 https://localhost:44321/

  • AD FS 애플리케이션 그룹을 만드는 동안 네이티브 애플리케이션 페이지의 리디렉션 URI 값으로 ida:RedirectUri 값을 설정합니다. 예를 들어 https://ToDoListClient

  • 읽기 용이성을 위해 ida:Tenantida:AADInstance에 대한 키를 제거/주석으로 달 수 있습니다.

    App config

MainWindow.xaml.cs

  • 아래와 같이 aadInstance에 대한 줄을 주석으로 달기

    // private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];

  • 아래와 같이 권한 값을 추가합니다.

    private static string authority = ConfigurationManager.AppSettings["ida:Authority"];

  • aadInstance 및 테넌트에서 기관 값을 만들기 위한 줄을 삭제합니다.

    private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

  • MainWindow함수에서 authContext 인스턴스화를 로 변경합니다.

    authContext = new AuthenticationContext(authority,false);

    ADAL은 AD FS 권한으로 유효성 검사를 지원하지 않으므로 validateAuthority 매개 변수에 대해 false 값 플래그를 전달해야 합니다.

    Main window

TodoListService 수정

이 프로젝트 – Web.config 및 Startup.Auth.cs에서 두 파일을 변경해야 합니다. 매개 변수의 올바른 값을 얻으려면 Web.Config 변경이 필요합니다. Azure AD가 아닌 AD FS 대해 인증하도록 WebAPI를 설정하려면 Startup.Auth.cs를 변경해야 합니다.

Web.config

  • 키가 필요하지 않기 때문에 ida:Tenant 키를 주석으로 달기
  • 페더레이션 서비스의 FQDN을 나타내는 값으로 ida:Authority에 대한 키를 추가합니다(예: ).
  • AD FS 애플리케이션 그룹 추가 중 Web API 구성 페이지에서 지정한 Web API 식별자 값으로 키 ida:Audience를 수정합니다.
  • 다음과 같이 AD FS 서비스의 페더레이션 메타데이터 URL에 해당하는 값으로 키 ida:AdfsMetadataEndpoint를 추가합니다.

Web config

Startup.Auth.cs

아래와 같이 ConfigureAuth 함수를 수정합니다.

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseActiveDirectoryFederationServicesBearerAuthentication(
            new ActiveDirectoryFederationServicesBearerAuthenticationOptions
            {
                MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"],
                TokenValidationParameters = new TokenValidationParameters()
                {
                    SaveSigninToken = true,
                    ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                }

            });
    }

기본적으로 AD FS 사용하고 AD FS 메타데이터에 대한 정보를 추가로 제공하고 토큰의 유효성을 검사하도록 인증을 구성하고 있습니다. 대상 클레임은 Web API에서 예상하는 값이어야 합니다. 애플리케이션 실행

  1. 솔루션 NativeClient-DotNet에서 마우스 오른쪽 단추를 클릭하고 속성으로 이동합니다. 아래와 같이 시작 Project 여러 시작 프로젝트로 변경하고 TodoListClient 및 TodoListService를 모두 시작으로 설정합니다. Solution properties

  2. F5 단추를 누르거나 메뉴 모음에서 디버그 > 계속을 선택합니다. 그러면 네이티브 애플리케이션과 WebAPI가 모두 시작됩니다. 네이티브 애플리케이션에서 로그인 단추를 클릭하면 AD AL에서 대화형 로그온이 팝업되고 AD FS 서비스로 리디렉션됩니다. 유효한 사용자의 자격 증명을 입력합니다. Screenshot showing the sign in dialog box.

이 단계에서 네이티브 애플리케이션은 AD FS 리디렉션되고 Web API에 대한 ID 토큰 및 액세스 토큰을 받았습니다.

  1. 입력란에 할 일 항목을 입력하고 항목 추가를 클릭합니다. 이 단계에서 애플리케이션은 Web API에 도달하여 할 일 항목을 추가하고, 이를 위해 AD FS 가져온 WebAPI에 대한 액세스 토큰을 제공합니다. Web API는 대상 값과 일치하여 토큰의 용도를 확인하고 페더레이션 메타데이터의 정보를 사용하여 토큰 서명을 확인합니다.

Sign-in

다음 단계

AD FS 개발