Compartir vía


Consideraciones para usar Xamarin iOS con MSAL.NET

Cuando use la Biblioteca de autenticación de Microsoft para .NET (MSAL.NET) en Xamarin iOS, debe:

  • Reemplazar e implementar la función OpenUrl en AppDelegate.
  • Habilitar grupos de cadenas de claves.
  • Habilitar el uso compartido de la caché de tokens.
  • Habilitar el acceso a cadenas de claves.
  • Entienda los problemas conocidos de iOS 12 e iOS 13 y la autenticación.

Nota:

Ni la versión 4.61.0 de MSAL.NET ni las posteriores proporcionan compatibilidad con la Plataforma universal de Windows (UWP), Xamarin Android y Xamarin iOS. Se recomienda migrar las aplicaciones de Xamarin a marcos modernos, como MAUI. Obtenga más información sobre el desuso en el Anuncio del próximo desuso de MSAL.NET para Xamarin y UWP.

Implementación de OpenUrl

Reemplace el método OpenUrl de la clase derivada FormsApplicationDelegate y llame a AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs. Este es un ejemplo:

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

Además, realice las siguientes tareas:

  • Defina un esquema de URI de redirección.
  • Exija permisos para que la aplicación llame a otra aplicación.
  • Disponga de un formato específico para el URI de redirección.
  • Registre un URI de redirección en Azure Portal.

Habilitación de acceso a la cadena de claves

Para habilitar el acceso a cadenas de claves, asegúrese de que la aplicación tenga un grupo de acceso a cadenas de claves. Puede establecer el grupo de acceso a cadenas de claves cuando cree la aplicación mediante la API WithIosKeychainSecurityGroup().

Para beneficiarse de la caché y del inicio de sesión único (SSO), establezca el grupo de acceso a cadenas de claves en el mismo valor en todas las aplicaciones.

En este ejemplo de configuración se usa MSAL 4.x:

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

Habilite también el acceso a cadenas de claves en el archivo Entitlements.plist. Use el siguiente grupo de acceso o el suyo propio.

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

Cuando se usa la API WithIosKeychainSecurityGroup(), MSAL anexa automáticamente el grupo de seguridad al final del identificador de equipo (AppIdentifierPrefix) de la aplicación. MSAL agrega el grupo de seguridad porque, al compilar la aplicación en Xcode, va a hacer lo mismo. Por eso, los derechos del archivo Entitlements.plist deben incluir $(AppIdentifierPrefix) antes del grupo de acceso a cadenas de claves.

Para obtener más información, vea la documentación sobre derechos de iOS.

Solución de problemas de acceso a la cadena de claves

Si recibe un mensaje de error similar a "La aplicación no puede acceder a la cadena de claves de iOS para el editor de la aplicación (TeamId es nulo)", significa que MSAL no puede acceder a la cadena de claves. Se trata de un problema de configuración. Para solucionar el problema, intente acceder a la cadena de claves por su cuenta, por ejemplo:

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

Habilitación del uso compartido de la caché de tokens entre aplicaciones de iOS

A partir de MSAL 2.x, puede especificar un grupo de acceso a cadenas de claves para conservar la caché de tokens en varias aplicaciones. Este valor permite compartir la caché de tokens entre varias aplicaciones con el mismo grupo de acceso a cadenas de claves. Puede compartir la caché de tokens entre aplicaciones de ADAL.NET, aplicaciones de Xamarin.iOS para MSAL.NET y aplicaciones nativas de iOS desarrolladas en ADAL.objc o MSAL.objc.

Al compartir la caché de tokens, se permite el inicio de sesión único (SSO) entre todas las aplicaciones que usan el mismo grupo de acceso a cadenas de claves.

Para habilitar este uso compartido de la caché, use el método WithIosKeychainSecurityGroup() para establecer el grupo de acceso a cadenas de claves en el mismo valor en todas las aplicaciones que comparten la misma caché. En el primer ejemplo de código de este artículo se muestra cómo usar el método.

Anteriormente en este artículo ha aprendido que MSAL agrega $(AppIdentifierPrefix) siempre que se usa la API WithIosKeychainSecurityGroup(). MSAL agrega este elemento porque el identificador de equipo AppIdentifierPrefix garantiza que solo las aplicaciones creadas por el mismo publicador puedan compartir el acceso a cadenas de claves.

Nota:

La propiedad KeychainSecurityGroup está en desuso. Utilice la propiedad iOSKeychainSecurityGroup en su lugar. El prefijo TeamId no es necesario cuando se usa iOSKeychainSecurityGroup.

Uso de Microsoft Authenticator

La aplicación puede usar Microsoft Authenticator como agente para habilitar:

  • SSO: al habilitar el inicio de sesión único, los usuarios no necesitan iniciar sesión en cada aplicación.
  • Identificación del dispositivo: use la identificación del dispositivo para autenticar mediante el acceso al certificado del dispositivo. Este certificado se crea en el dispositivo cuando se une al área de trabajo. La aplicación está lista si los administradores de inquilinos habilitan el acceso condicional relacionado con los dispositivos.
  • Comprobación de identificación de la aplicación: cuando una aplicación llama al agente, pasa su URL de redireccionamiento. El agente comprueba la URL de redireccionamiento.

Para obtener detalles sobre cómo habilitar un agente, vea Uso de Microsoft Authenticator o el Portal de empresa de Microsoft Intune en aplicaciones de Android y Xamarin iOS.

Problemas conocidos con iOS 12 y la autenticación

Microsoft ha publicado un aviso de seguridad sobre una incompatibilidad entre iOS 12 y algunos tipos de autenticación. La incompatibilidad afecta a los inicios de sesión en redes sociales, WSFed y OIDC. El aviso de seguridad ayuda a comprender cómo quitar las restricciones de seguridad de ASP.NET de las aplicaciones para que sean compatibles con iOS 12.

Al desarrollar aplicaciones MSAL.NET en Xamarin iOS, puede experimentar un bucle infinito al intentar iniciar sesión en sitios web desde iOS 12. Dicho comportamiento es similar a esta incidencia de ADAL en GitHub: Bucle infinito al intentar iniciar sesión en el sitio web desde iOS 12 #1329.

También puede observar una incidencia en la autenticación en OIDC de ASP.NET Core con Safari para iOS 12. Para obtener más información, vea este problema de WebKit.

Problemas conocidos con iOS 13 y la autenticación

Si la aplicación necesita compatibilidad con el acceso condicional o la autenticación de certificados, permita que se comunique con la aplicación agente de Microsoft Authenticator. De este modo, MSAL es responsable de administrar las solicitudes y respuestas entre la aplicación y Microsoft Authenticator.

En iOS 13, Apple realizó un cambio de API importante al eliminar la posibilidad de que la aplicación leyera la aplicación de origen al recibir una respuesta de una aplicación externa mediante esquemas de URL personalizados.

En la documentación de Apple para UIApplicationOpenURLOptionsSourceApplicationKey se dice:

Si la solicitud se originó en otra aplicación que pertenece a su equipo, UIKit establece el valor de esta clave en el identificador de esa aplicación. Si el identificador de equipo de la aplicación de origen es diferente al de la aplicación actual, el valor de la clave es nulo.

Este cambio es novedoso para MSAL porque se basaba en UIApplication.SharedApplication.OpenUrl para comprobar la comunicación entre MSAL y la aplicación Microsoft Authenticator.

Además, en iOS 13, el desarrollador debe proporcionar un controlador de presentación cuando se usa ASWebAuthenticationSession.

La aplicación resulta afectada si compila con Xcode 11 y usa el agente de iOS o ASWebAuthenticationSession.

En tales casos, use MSAL.NET 4.4.0 + para permitir la autenticación correcta.

Requisitos adicionales

  • Cuando use las bibliotecas de MSAL más recientes, asegúrese de que esté instalada la versión 6.3.19 + de Microsoft Authenticator en el dispositivo.

  • Al actualizar a MSAL.NET 4.4.0+, actualice el valor de LSApplicationQueriesSchemes en el archivo Info.plist y agregue msauthv3:

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

    Es necesario agregar msauthv3 a Info.plist para detectar la presencia de la última aplicación de Microsoft Authenticator en el dispositivo que admite iOS 13.

Notificar un problema

Si tiene alguna pregunta o quiere informar de un problema que ha encontrado en MSAL.NET, abra una incidencia en el repositorio microsoft-authentication-library-for-dotnet de GitHub.

Pasos siguientes

Para obtener información sobre las propiedades de Xamarin iOS, vea el párrafo Consideraciones específicas de iOS del archivo README.md del ejemplo siguiente:

Muestra Plataforma Descripción
https://github.com/Azure-Samples/active-directory-xamarin-native-v2 Xamarin iOS, Android, Plataforma universal de Windows (UWP) Una aplicación de Xamarin Forms que muestra cómo usar MSAL.NET para autenticar cuentas profesionales o educativas y personales de Microsoft con la plataforma de identidad de Microsoft y acceder a Microsoft Graph con el token resultante.