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:

  • Substitua e implemente a OpenUrl função em AppDelegate.
  • Habilite grupos de chaveiros.
  • Habilite o compartilhamento de cache de token.
  • Habilite o acesso às chaves.
  • Entenda os problemas conhecidos com iOS 12 e iOS 13 e autenticação.

Implementar OpenUrl

Substitua o OpenUrlFormsApplicationDelegate método da classe derivada e chame AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs. Eis um exemplo:

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

Além disso, execute as seguintes tarefas:

  • Defina um esquema de URI de redirecionamento.
  • Exigir permissões para que seu aplicativo chame outro aplicativo.
  • Tenha um formulário específico para o URI de redirecionamento.
  • Registre um URI de redirecionamento no portal do Azure.

Ativar o acesso às chaves

Para habilitar o acesso às chaves, verifique se seu aplicativo tem um grupo de acesso às chaves. Você pode definir o grupo de acesso às chaves ao criar seu aplicativo usando a WithIosKeychainSecurityGroup() API.

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

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

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

Habilite também o acesso às chaves no Entitlements.plist arquivo. Use o seguinte grupo de acesso 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, o WithIosKeychainSecurityGroup() MSAL acrescenta automaticamente seu grupo de segurança ao final do ID de equipe do aplicativo (AppIdentifierPrefix). MSAL adiciona seu grupo de segurança porque quando você cria seu aplicativo no Xcode, ele fará o mesmo. É por isso que os direitos no Entitlements.plist arquivo precisam ser incluídos $(AppIdentifierPrefix) antes do grupo de acesso às chaves.

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

Solução de problemas de acesso ao KeyChain

Se você receber uma mensagem de erro semelhante a "O aplicativo não pode acessar as chaves do iOS para o editor do aplicativo (o TeamId é nulo)", isso significa que o MSAL não pode acessar o KeyChain. Trata-se de um problema de configuração. Para solucionar problemas, tente acessar o KeyChain 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

Habilite o compartilhamento de cache de token entre aplicativos iOS

A partir do MSAL 2.x, você pode especificar um grupo de acesso às chaves para manter 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 de chaves. Você pode compartilhar o cache de token entre aplicativos ADAL.NET , MSAL.NET aplicativos Xamarin.iOS e aplicativos iOS nativos que foram desenvolvidos em ADAL.objc ou MSAL.objc.

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

Para habilitar esse compartilhamento de cache, use o WithIosKeychainSecurityGroup() método para definir o grupo de acesso às 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.

No início deste artigo, você aprendeu que o MSAL adiciona $(AppIdentifierPrefix) sempre que você usa a WithIosKeychainSecurityGroup() API. O MSAL adiciona esse elemento porque o ID AppIdentifierPrefix da equipe garante que apenas os aplicativos feitos pelo mesmo editor possam compartilhar o acesso às chaves.

Nota

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

Usar o Microsoft Authenticator

Seu aplicativo pode usar o Microsoft Authenticator como um broker para permitir:

  • SSO: Quando você habilita o SSO, seus 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. Este certificado é criado no dispositivo quando é associado ao local de trabalho. Seu aplicativo estará pronto se os administradores de locatários habilitarem o Acesso Condicional relacionado aos dispositivos.
  • Verificação de identificação do aplicativo: quando um aplicativo chama o corretor, ele passa sua URL de redirecionamento. O corretor verifica o URL de redirecionamento.

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

Problemas conhecidos com o iOS 12 e autenticação

A Microsoft lançou um comunicado de segurança sobre uma incompatibilidade entre o iOS 12 e alguns tipos de autenticação. A incompatibilidade interrompe os logins sociais, WSFed e OIDC. O comunicado de segurança ajuda-o a compreender como remover ASP.NET restrições de segurança das suas aplicações para as tornar compatíveis com o iOS 12.

Ao desenvolver aplicativos MSAL.NET no Xamarin iOS, você pode ver um loop infinito ao tentar entrar em sites a partir do iOS 12. Tal comportamento é semelhante a este problema ADAL no GitHub: loop infinito ao tentar fazer login no site a partir do iOS 12 #1329.

Você também pode ver uma quebra na autenticação OIDC ASP.NET Core com o Safari do iOS 12. Para obter mais informações, consulte este problema do WebKit.

Problemas conhecidos com o iOS 13 e autenticação

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

No iOS 13, a Apple fez uma alteração de quebra na API, removendo a capacidade do aplicativo de 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 afirma:

Se a solicitação tiver sido originada de outro aplicativo pertencente à sua equipe, o UIKit definirá 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 está quebrando para a MSAL porque ela se baseou UIApplication.SharedApplication.OpenUrl para verificar a comunicação entre a MSAL e o aplicativo Microsoft Authenticator.

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

Seu aplicativo será afetado se você estiver criando com o Xcode 11 e usar o corretor iOS ou ASWebAuthenticationSessiono .

Nesses casos, use o 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 o MSAL.NET 4.4.0+, atualize o seu LSApplicationQueriesSchemes no arquivo Info.plist e adicione msauthv3:

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

    Adicionar msauthv3 ao Info.plist é necessário para detetar a presença do aplicativo Microsoft Authenticator mais recente no dispositivo compatível com iOS 13.

Comunicar um problema

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

Próximos passos

Para obter informações sobre propriedades do Xamarin iOS, consulte o parágrafo de considerações específicas do iOS do arquivo de README.md do exemplo a seguir:

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