Considerações sobre o uso do Xamarin iOS com MSAL.NET

Ao usar a Biblioteca de Autenticação da Microsoft para .NET (MSAL.NET) no Xamarin iOS, você deve:

  • Substituir e implementar a função OpenUrl em AppDelegate.
  • Habilitar grupos de conjuntos de chaves.
  • Habilitar o compartilhamento de cache do token.
  • Habilitar o acesso ao conjunto de chaves.
  • Reconhecer os problemas conhecidos com o iOS 12 e o iOS 13 e a autenticação.

Implementar OpenUrl

Substituir o método OpenUrl da classe derivada FormsApplicationDelegate e chamar AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs. Veja um exemplo:

public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
    AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
    return true;
}

Execute ainda as seguintes etapas:

  • Definir um esquema de URI de redirecionamento.
  • Exigir permissões para que o aplicativo chame outro aplicativo.
  • Ter um formulário específico para o URI de redirecionamento.
  • Registrar um URI de redirecionamento no portal do Azure.

Habilitar o acesso ao conjunto de chaves

Para habilitar o acesso ao conjunto de chaves, certifique-se de que o aplicativo tenha um grupo de acesso ao conjunto de chaves. Use a API WithIosKeychainSecurityGroup() ao criar o aplicativo para definir o grupo de acesso do conjunto de chaves.

Para se beneficiar do cache e do SSO (login único), defina o grupo de acesso do conjunto de chaves com o mesmo valor em todos os aplicativos.

Este exemplo da instalação usa a MSAL 4.x:

var builder = PublicClientApplicationBuilder
     .Create(ClientId)
     .WithIosKeychainSecurityGroup("com.microsoft.adalcache")
     .Build();

Habilita também o acesso ao conjunto de chaves no arquivo Entitlements.plist. Use o grupo de acesso a seguir ou seu próprio grupo de acesso.

<dict>
  <key>keychain-access-groups</key>
  <array>
    <string>$(AppIdentifierPrefix)com.microsoft.adalcache</string>
  </array>
</dict>

Quando você usa a API WithIosKeychainSecurityGroup(), a MSAL acrescenta automaticamente seu grupo de segurança ao final da ID de equipe do aplicativo (AppIdentifierPrefix). A MSAL adiciona o grupo de segurança porque, quando você cria o aplicativo em Xcode, ele fará o mesmo. É por isso que os direitos no arquivo Entitlements.plist precisam incluir $(AppIdentifierPrefix) antes do grupo de acesso do conjunto de chaves.

Para obter mais informações, consulte a documentação de direitos do iOS.

Solucionar problemas de acesso ao conjunto de chaves

Se você receber uma mensagem de erro semelhante a "O aplicativo não pode acessar o conjunto de chaves do iOS do publicador do aplicativo (o TeamID é nulo)", isso significa que o MSAL não é capaz de acessar o conjunto de chaves. Esse é um problema de configuração. Para solucionar o problema, tente acessar o conjunto de chaves por conta própria, por exemplo:

var queryRecord = new SecRecord(SecKind.GenericPassword)
{
    Service = "",
    Account = "SomeTeamId",
    Accessible = SecAccessible.Always
};

SecRecord match = SecKeyChain.QueryAsRecord(queryRecord, out SecStatusCode resultCode);

if (resultCode == SecStatusCode.ItemNotFound)
{
    SecKeyChain.Add(queryRecord);
    match = SecKeyChain.QueryAsRecord(queryRecord, out resultCode);
}

// Make sure that  resultCode == SecStatusCode.Success

Habilitar o compartilhamento de cache de token entre aplicativos iOS

A partir da MSAL 2.x, é possível especificar um grupo de acesso do conjunto de chaves para persistir o cache de token em vários aplicativos. Essa configuração permite que você compartilhe o cache de token entre vários aplicativos que têm o mesmo grupo de acesso do conjunto de chaves. Você pode compartilhar o cache de token entre aplicativos ADAL.NET, aplicativos MSAL.NET Xamarin.iOS e aplicativos iOS nativos que foram desenvolvidos em ADAL.objc ou MSAL.objc.

Ao compartilhar o cache de token, você permite o SSO (logon único) entre todos os aplicativos que usam o mesmo grupo de acesso do conjunto de chaves.

Para habilitar esse compartilhamento de cache, use o método WithIosKeychainSecurityGroup() para definir o grupo de acesso do conjunto de chaves com o mesmo valor em todos os aplicativos que compartilham o mesmo cache. O primeiro exemplo de código neste artigo mostra como usar o método.

Anteriormente neste artigo, você aprendeu que a MSAL adiciona $(AppIdentifierPrefix) sempre que você usa a API WithIosKeychainSecurityGroup(). A MSAL adiciona esse elemento porque a ID de equipe AppIdentifierPrefix garante que apenas os aplicativos que sejam feitos pelo mesmo editor possam compartilhar o acesso ao conjunto de chaves.

Observação

A propriedade KeychainSecurityGroup é preterida. Use a propriedade iOSKeychainSecurityGroup. O prefixo TeamId não é necessário quando você usa iOSKeychainSecurityGroup.

Usar o Microsoft Authenticator

Seu aplicativo pode usar o Microsoft Authenticator como um agente para habilitar:

  • SSO: quando você habilita SSO, os usuários não precisam entrar em cada aplicativo.
  • Identificação do dispositivo: use a identificação do dispositivo para autenticar acessando o certificado do dispositivo. Esse certificado é criado no dispositivo ao associá-lo ao local de trabalho. Seu aplicativo estará pronto se os administradores de locatários habilitarem o acesso condicional relacionado aos dispositivos.
  • Verificação da identificação do aplicativo: quando um aplicativo chama o agente, ele transmite sua URL de redirecionamento. O agente verifica a URL de redirecionamento.

Para obter detalhes sobre como habilitar um agente, consulte Usar o Microsoft Authenticator ou o Portal da Empresa Microsoft Intune em aplicativos Xamarin iOS e Android.

Problemas conhecidos com o iOS 12 e a autenticação

A Microsoft lançou uma notificação de segurança sobre uma incompatibilidade entre o iOS 12 e alguns tipos de autenticação. A incompatibilidade interrompe as entradas sociais, WSFed e OIDC. A notificação de segurança ajuda a entender como remover restrições de segurança ASP.NET dos aplicativos para torná-los compatíveis com o iOS 12.

Quando você desenvolve a MSAL.NET aplicativos no Xamarin iOS, poderá ver um loop infinito ao tentar entrar em sites pelo iOS 12. Esse comportamento é semelhante a esse problema da ADAL no GitHub: Loop infinito ao tentar fazer logon no site a partir do iOS 12 #1329.

Você também pode ver uma falha na autenticação ASP.NET Core OIDC com o iOS 12 Safari. Para saber mais, veja este problema do WebKit.

Problemas conhecidos com o iOS 13 e a autenticação

Se o aplicativo exigir acesso condicional ou suporte à autenticação de certificado, habilite o aplicativo para se comunicar com o aplicativo do agente Microsoft Authenticator. A MSAL é responsável por tratar solicitações e respostas entre o aplicativo e Microsoft Authenticator.

No iOS 13, a Apple fez uma alteração interruptiva da API removendo a capacidade do aplicativo para ler o aplicativo de origem ao receber uma resposta de um aplicativo externo por meio de esquemas de URL personalizados.

A documentação da Apple para UIApplicationOpenURLOptionsSourceApplicationKey informa:

Se a solicitação foi originada de outro aplicativo pertencente à sua equipe, o UIKit define o valor dessa chave como a ID desse aplicativo. Se o identificador de equipe do aplicativo de origem for diferente do identificador de equipe do aplicativo atual, o valor da chave será nulo.

Essa alteração é interruptiva para a MSAL porque ela dependia de UIApplication.SharedApplication.OpenUrl para verificar a comunicação entre a MSAL e o aplicativo Microsoft Authenticator.

Além disso, no iOS 13, o desenvolvedor precisa fornecer um controlador de apresentação ao usar ASWebAuthenticationSession.

Seu aplicativo será afetado se você compilar com o Xcode 11 e usar o agente do iOS ou ASWebAuthenticationSession.

Nesses casos, use a MSAL.NET 4.4.0+ para habilitar a autenticação bem-sucedida.

Requisitos adicionais

  • Ao usar as bibliotecas MSAL mais recentes, verifique se o Microsoft Authenticator versão 6.3.19+ está instalado no dispositivo.

  • Ao atualizar para MSAL.NET 4.4.0+, atualize o LSApplicationQueriesSchemes em Info.plist e adicione msauthv3:

    <key>LSApplicationQueriesSchemes</key>
    <array>
         <string>msauthv2</string>
         <string>msauthv3</string>
    </array>
    

    Adicionar msauthv3 a Info.plist é necessário para detectar a presença do aplicativo Microsoft Authenticator mais recente no dispositivo que dá suporte ao iOS 13.

Relatar um problema

Se você tiver dúvidas ou quiser relatar um problema que encontrou na MSAL.NET, abra um problema no repositório microsoft-authentication-library-for-dotnet no GitHub.

Próximas etapas

Para obter informações sobre as propriedades do Xamarin iOS, veja o parágrafo Considerações específicas do iOS do arquivo README.MD do exemplo a seguir:

Amostra Plataforma Descrição
https://github.com/Azure-Samples/active-directory-xamarin-native-v2 Xamarin iOS, Android, Plataforma Universal do Windows (UWP) Um aplicativo do Xamarin Forms mostrando como usar MSAL.NET para autenticar as contas pessoais corporativas ou de estudante e da Microsoft com a plataforma de identidade da Microsoft e acessar o Microsoft Graph com o token resultante.