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 emAppDelegate
. - 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.
Nota
MSAL.NET versões 4.61.0 e superiores não oferecem suporte para a Plataforma Universal do Windows (UWP), Xamarin Android e Xamarin iOS. Recomendamos que você migre seus aplicativos Xamarin para estruturas modernas como MAUI. Leia mais sobre a descontinuação em Anunciando a próxima substituição do MSAL.NET para Xamarin e UWP.
Implementar OpenUrl
Substitua o OpenUrl
FormsApplicationDelegate
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 iOSKeychainSecurityGroup
o .
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 ASWebAuthenticationSession
o .
Seu aplicativo será afetado se você estiver criando com o Xcode 11 e usar o corretor iOS ou ASWebAuthenticationSession
o .
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 adicionemsauthv3
:<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. |