Share via


웹 인증 브로커

이 문서에서는 UWP(유니버설 Windows 플랫폼) 앱을 OpenID 또는 OAuth와 같은 인증 프로토콜을 사용하는 온라인 ID 공급자에 연결하는 방법을 설명합니다. AuthenticateAsync 메서드는 온라인 ID 공급자로 요청을 보내고 앱이 액세스할 수 있는 공급자 리소스에 대해 설명하는 액세스 토큰을 다시 가져옵니다.

참고 항목

완전한 코드 샘플을 사용하려면 GitHub의 WebAuthenticationBroker 리포지토리를 복제하세요.

 

온라인 공급자에 앱 등록

연결하려는 온라인 ID 공급자에 앱을 등록해야 합니다. ID 공급자에서 앱을 등록하는 방법을 확인할 수 있습니다. 등록 후 온라인 공급자는 일반적으로 앱에 대한 ID 또는 비밀 키를 제공합니다.

인증 요청 URI 빌드

요청 URI는 앱 ID 또는 비밀, 인증을 완료한 후 사용자가 전송되는 리디렉션 URI 및 예상 응답 유형과 같은 다른 필수 정보가 추가된 온라인 공급자에게 인증 요청을 보내는 주소로 구성됩니다. 공급자에서 필요한 매개 변수를 확인할 수 있습니다.

요청 URI는 AuthenticateAsync 메서드의 requestUri 매개 변수로 전송됩니다. https://로 시작하는 보안 주소여야 합니다.

다음 예제에서는 요청 URI를 빌드하는 방법을 보여줍니다.

string startURL = "https://<providerendpoint>?client_id=<clientid>&scope=<scopes>&response_type=token";
string endURL = "http://<appendpoint>";

System.Uri startURI = new System.Uri(startURL);
System.Uri endURI = new System.Uri(endURL);

온라인 공급자에게 커넥트

AuthenticateAsync 메서드를 호출하여 온라인 ID 공급자에 연결하고 액세스 토큰을 가져옵니다. 이 메서드는 이전 단계에서 생성된 URI를 requestUri 매개 변수로 사용하고 사용자를 callbackUri 매개 변수로 리디렉션하려는 URI를 사용합니다.

string result;

try
{
    var webAuthenticationResult = 
        await Windows.Security.Authentication.Web.WebAuthenticationBroker.AuthenticateAsync( 
        Windows.Security.Authentication.Web.WebAuthenticationOptions.None, 
        startURI, 
        endURI);

    switch (webAuthenticationResult.ResponseStatus)
    {
        case Windows.Security.Authentication.Web.WebAuthenticationStatus.Success:
            // Successful authentication. 
            result = webAuthenticationResult.ResponseData.ToString(); 
            break;
        case Windows.Security.Authentication.Web.WebAuthenticationStatus.ErrorHttp:
            // HTTP error. 
            result = webAuthenticationResult.ResponseErrorDetail.ToString(); 
            break;
        default:
            // Other error.
            result = webAuthenticationResult.ResponseData.ToString(); 
            break;
    } 
}
catch (Exception ex)
{
    // Authentication failed. Handle parameter, SSL/TLS, and Network Unavailable errors here. 
    result = ex.Message;
}

Warning

AuthenticateAsync 외에도 Windows.Security.Authentication.Web 네임스페이스에 AuthenticateAndContinue 메서드가 포함되어 있습니다. 이 메서드를 호출하지 마세요. Windows 전화 8.1만 대상으로 하는 앱용으로 설계되었으며 Windows 10부터 사용되지 않습니다.

SSO(Single Sign-On)를 사용하여 커넥트.

기본적으로 웹 인증 브로커는 쿠키를 유지하도록 허용하지 않습니다. 이 때문에 앱 사용자가 로그인 상태를 유지한다고 표시하더라도(예: 공급자의 로그인 대화 상자에서 검사 상자를 선택하여) 해당 공급자의 리소스에 액세스할 때마다 로그인해야 합니다. SSO로 로그인하려면 온라인 ID 공급자가 웹 인증 브로커에 대해 SSO를 사용하도록 설정해야 하며 앱은 callbackUri 매개 변수를 사용하지 않는 AuthenticateAsync오버로드를 호출해야 합니다. 이렇게 하면 웹 인증 브로커가 영구적 쿠키를 저장할 수 있기 때문에 향후 같은 앱에서 인증을 호출할 때 사용자가 반복적으로 로그인을 할 필요가 없습니다(액세스 토큰이 만료될 때까지 사용자가 효과적으로 "로그인").

SSO를 지원하려면 온라인 공급자가 ms-app://<appSID> 형식의 리디렉션 URI를 등록할 수 있도록 허용해야 합니다. 여기서 <appSID>는 앱의 SID입니다. 앱의 앱 개발자 페이지에서 또는 GetCurrentApplicationCallbackUri 메서드를 호출하여 앱의 SID를 찾을 수 있습니다.

string result;

try
{
    var webAuthenticationResult = 
        await Windows.Security.Authentication.Web.WebAuthenticationBroker.AuthenticateAsync( 
        Windows.Security.Authentication.Web.WebAuthenticationOptions.None, 
        startURI);

    switch (webAuthenticationResult.ResponseStatus)
    {
        case Windows.Security.Authentication.Web.WebAuthenticationStatus.Success:
            // Successful authentication. 
            result = webAuthenticationResult.ResponseData.ToString(); 
            break;
        case Windows.Security.Authentication.Web.WebAuthenticationStatus.ErrorHttp:
            // HTTP error. 
            result = webAuthenticationResult.ResponseErrorDetail.ToString(); 
            break;
        default:
            // Other error.
            result = webAuthenticationResult.ResponseData.ToString(); 
            break;
    } 
}
catch (Exception ex)
{
    // Authentication failed. Handle parameter, SSL/TLS, and Network Unavailable errors here. 
    result = ex.Message;
}

디버깅

운영 로그를 검토하고 Fiddler를 사용하여 웹 요청 및 응답을 검토하는 등 웹 인증 브로커 API 문제를 해결하는 여러 가지 방법이 있습니다.

운영 로그

종종 작업 로그를 사용하여 작동하지 않는 항목을 확인할 수 있습니다. 웹 사이트 개발자가 웹 인증 브로커에 의한 웹 페이지 처리 방법을 이해할 수 있도록 도와주는 전용 이벤트 로그 채널인 Microsoft-Windows-WebAuth\Operational이 있습니다. 이 채널을 사용하려면 eventvwr.exe를 시작하고 Application and Services\Microsoft\Windows\WebAuth 아래의 작업 로그를 사용하도록 설정합니다. 또한 웹 인증 브로커는 사용자 에이전트 문자열에 고유한 문자열을 추가하여 웹 서버에서 자신을 식별합니다. 문자열은 "MSAuthHost/1.0"입니다. 버전 번호는 나중에 변경될 수 있으므로 코드에서 해당 버전 번호에 의존해서는 안 됩니다. 전체 사용자 에이전트 문자열과 전체 디버깅 단계의 예는 다음과 같습니다.

User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; MSAuthHost/1.0)

  1. 운영 로그를 사용하도록 설정합니다.
  2. Contoso 소셜 애플리케이션을 실행합니다. event viewer displaying the webauth operational logs
  3. 생성된 로그 항목을 사용하여 웹 인증 브로커의 동작을 더 자세히 이해할 수 있습니다. 이 경우 다음을 포함할 수 있습니다.
    • 탐색 시작: AuthHost가 시작될 때 기록되고 시작 및 종료 URL에 대한 정보가 포함됩니다.
    • illustrates the details of navigation start
    • 탐색 완료: 웹 페이지 로드 완료를 기록합니다.
    • 메타 태그: 세부 정보를 포함하여 메타 태그가 발견되면 기록합니다.
    • 탐색 종료: 사용자가 종료한 탐색입니다.
    • 탐색 오류: AuthHost가 HttpStatusCode를 포함한 URL에서 탐색 오류가 발생합니다.
    • 탐색 끝: 종료 URL이 발견되었습니다.

Fiddler

Fiddler 웹 디버거는 앱에서 사용할 수 있습니다. 자세한 내용은 Fiddler 설명서를 참조하세요.

  1. AuthHost는 개인 네트워크 기능을 제공하기 위해 고유한 앱 컨테이너에서 실행되므로 레지스트리 키를 설정해야 합니다. Windows 레지스트리 편집기 버전 5.00

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\authhost.exe\EnablePrivateNetwork = 00000001

    이 레지스트리 키가 없는 경우 관리자 권한으로 명령 프롬프트에서 만들 수 있습니다.

    REG ADD "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\authhost.exe" /v EnablePrivateNetwork /t REG_DWORD /d 1 /f
    
  2. 아웃바운드 트래픽을 생성하기 때문에 AuthHost에 대한 규칙을 추가합니다.

    CheckNetIsolation.exe LoopbackExempt -a -n=microsoft.windows.authhost.a.p_8wekyb3d8bbwe
    CheckNetIsolation.exe LoopbackExempt -a -n=microsoft.windows.authhost.sso.p_8wekyb3d8bbwe
    CheckNetIsolation.exe LoopbackExempt -a -n=microsoft.windows.authhost.sso.c_8wekyb3d8bbwe
    D:\Windows\System32>CheckNetIsolation.exe LoopbackExempt -s
    List Loopback Exempted AppContainers
    [1] -----------------------------------------------------------------
        Name: microsoft.windows.authhost.sso.c_8wekyb3d8bbwe
        SID:  S-1-15-2-1973105767-3975693666-32999980-3747492175-1074076486-3102532000-500629349
    [2] -----------------------------------------------------------------
        Name: microsoft.windows.authhost.sso.p_8wekyb3d8bbwe
        SID:  S-1-15-2-166260-4150837609-3669066492-3071230600-3743290616-3683681078-2492089544
    [3] -----------------------------------------------------------------
        Name: microsoft.windows.authhost.a.p_8wekyb3d8bbwe
        SID:  S-1-15-2-3506084497-1208594716-3384433646-2514033508-1838198150-1980605558-3480344935
    
  3. Fiddler에 들어오는 트래픽에 대한 방화벽 규칙을 추가합니다.