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
emAppDelegate
. - 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.
Observação
As versões 4.61.0 e superiores do MSAL.NET não oferecem suporte à Plataforma Universal do Windows (UWP), Xamarin Android e Xamarin iOS. Recomendamos que você migre seus aplicativos Xamarin para estruturas modernas, como o MAUI. Leia mais sobre a substituição em Anunciando a substituição futura de MSAL.NET para Xamarin e UWP.
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 adicionemsauthv3
:<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. |