Compartilhar via


Agente de autenticação da Web

Este artigo explica como conectar seu aplicativo do UWP (Plataforma Universal do Windows) a um provedor de identidade online que usa protocolos de autenticação como o OpenID ou o OAuth. O método AuthenticateAsync envia uma solicitação ao provedor de identidade online e obtém um token de acesso que descreve os recursos do provedor aos quais o aplicativo tem acesso.

Observação

Para obter um exemplo de código de trabalho completo, clone o repositório WebAuthenticationBroker no GitHub.

 

Registrar seu aplicativo com seu provedor online

Você deve registrar seu aplicativo com o provedor de identidade online ao qual deseja se conectar. Você pode descobrir como registrar seu aplicativo no provedor de identidade. Depois de se registrar, o provedor online geralmente fornece uma ID ou chave secreta para seu aplicativo.

Criar o URI da solicitação de autenticação

O URI da solicitação consiste no endereço para o qual você envia a solicitação de autenticação ao provedor online anexado com outras informações necessárias, como uma ID de aplicativo ou segredo, um URI de redirecionamento para o qual o usuário é enviado após concluir a autenticação e o tipo de resposta esperado. Você pode descobrir com seu provedor quais parâmetros são necessários.

O URI da solicitação é enviado como o parâmetro requestUri do método AuthenticateAsync. Deve ser um endereço seguro (deve começar com https://)

O exemplo a seguir mostra como desenvolver o URI da solicitação.

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);

Conectar-se ao provedor online

Você chama o método AuthenticateAsync para se conectar ao provedor de identidade online e obter um token de acesso. O método usa o URI construído na etapa anterior como o parâmetro requestUri e um URI para o qual você deseja que o usuário seja redirecionado como o parâmetro callbackUri .

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;
}

Aviso

Além do AuthenticateAsync, o namespace Windows.Security.Authentication.Web contém um método AuthenticateAndContinue. Não chame esse método. Ele foi projetado para aplicativos destinados apenas ao Windows Phone 8.1 e foi preterido a partir do Windows 10.

Conectar-se com o logon único (SSO).

Por padrão, o agente de autenticação da Web não permite que os cookies persistam. Por isso, mesmo que o usuário do aplicativo indique que deseja permanecer conectado (por exemplo, marcando uma caixa de seleção na caixa de diálogo de logon do provedor), ele terá que fazer logon sempre que quiser acessar recursos para esse provedor. Para fazer logon com SSO, seu provedor de identidade online deve ter habilitado o SSO para agente de autenticação da Web e seu aplicativo deve chamar a sobrecarga de AuthenticateAsync que não usa um parâmetro callbackUri. Isso permitirá que os cookies persistentes sejam armazenados pelo agente de autenticação da Web, para que futuras chamadas de autenticação pelo mesmo aplicativo não exijam logon repetido pelo usuário (o usuário é efetivamente "conectado" até que o token de acesso expire).

Para oferecer suporte ao SSO, o provedor online deve permitir que você registre um URI de redirecionamento no formato ms-app://<appSID>, onde <appSID> é o SID do seu aplicativo. Você pode encontrar o SID do aplicativo na página do desenvolvedor do aplicativo ou chamando o método GetCurrentApplicationCallbackUri.

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;
}

Depuração

Há várias maneiras de solucionar problemas das APIs do agente de autenticação da Web, incluindo a revisão de logs operacionais e a revisão de solicitações e respostas da Web usando o Fiddler.

Logs operacionais

Muitas vezes, você pode determinar o que não está funcionando usando os logs operacionais. Há um canal de log de eventos dedicado Microsoft-Windows-WebAuth\Operational que permite que os desenvolvedores de sites entendam como suas páginas da Web estão sendo processadas pelo agente de autenticação da Web. Para habilitá-lo, inicie o programa eventvwr.exe e habilite o log operacional no aplicativo e serviços\Microsoft\Windows\WebAuth. Além disso, o agente de autenticação da Web acrescenta uma cadeia de caracteres exclusiva à cadeia de caracteres do agente do usuário para se identificar no servidor da Web. A cadeia de caracteres é "MSAuthHost/1.0". Observe que o número da versão pode mudar no futuro, portanto, você não deve depender desse número de versão em seu código. Um exemplo da cadeia de caracteres completa do agente do usuário, seguida por etapas completas de depuração, é a seguinte.

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

  1. Habilitar logs operacionais.
  2. Executar o aplicativo social Contoso. Visualizador de eventos exibindo os logs operacionais do WebAuth
  3. As entradas de logs geradas podem ser usadas para entender o comportamento do agente de autenticação da Web com mais detalhes. Nesse caso, elas podem incluir:
    • Início da navegação: registra quando o AuthHost é iniciado e contém informações sobre as URLs de início e término.
    • ilustra os detalhes do início da navegação
    • Navegação concluída: registra a conclusão do carregamento de uma página da Web.
    • Meta Tag: Registra quando uma meta-tag é encontrada, incluindo os detalhes.
    • Encerrar navegação: navegação encerrada pelo usuário.
    • Erro de navegação: AuthHost encontra um erro de navegação em uma URL incluindo HttpStatusCode.
    • Fim da navegação: URL de encerramento é encontrado.

Fiddler

O depurador Web do Fiddler pode ser usado com aplicativos. Saiba mais na documentação do Fiddler.

  1. Como o AuthHost é executado em seu próprio contêiner de aplicativo, para fornecer a ele o recurso de rede privada, você deve definir uma chave do Registro: Editor do Registro do Windows Versão 5.00

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

    Se você não tiver essa chave do Registro, poderá criá-la em um Prompt de Comando com privilégios de administrador.

    REG ADD "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\authhost.exe" /v EnablePrivateNetwork /t REG_DWORD /d 1 /f
    
  2. Adicione uma regra para o AuthHost, pois é isso que está gerando o tráfego de saída.

    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. Adicione uma regra de firewall para o tráfego de entrada ao Fiddler.