Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Información general
En este tema se muestra cómo autenticar a los usuarios de una aplicación móvil de App Service desde la aplicación cliente. En este tutorial, agregará autenticación al proyecto de inicio rápido de Xamarin Forms mediante un proveedor de identidades compatible con App Service. Después de ser autentificado y autorizado correctamente por tu aplicación móvil, se muestra el valor del ID de usuario y podrás acceder a los datos de la tabla restringida.
Prerrequisitos
Para obtener el mejor resultado con este tutorial, se recomienda completar primero el tutorial Creación de una aplicación de Xamarin Forms. Después de completar este tutorial, tendrá un proyecto de Xamarin Forms que es una aplicación TodoList multiplataforma.
Si no usa el proyecto de servidor de inicio rápido descargado, debe agregar el paquete de extensión de autenticación al proyecto. Para más información sobre los paquetes de extensión de servidor, consulte Trabajar con el SDK del servidor back-end de .NET para Azure Mobile Apps.
Registro de la aplicación para la autenticación y configuración de App Services
En primer lugar, debe registrar la aplicación en el sitio de un proveedor de identidades y, a continuación, establecerá las credenciales generadas por el proveedor en el back-end de Mobile Apps.
Configure el proveedor de identidades preferido siguiendo las instrucciones específicas del proveedor:
Repita los pasos anteriores para cada proveedor que quiera admitir en la aplicación.
Agregar la aplicación a las direcciones URL de redirección externas permitidas
La autenticación segura requiere que defina un nuevo esquema de dirección URL para la aplicación. Esto permite que el sistema de autenticación vuelva a redirigir a la aplicación una vez completado el proceso de autenticación. En este tutorial, se utiliza el esquema de URL nombre de la aplicación. Sin embargo, puede usar cualquier esquema de dirección URL que elija. Debe ser único para la aplicación móvil. Para habilitar el redireccionamiento en el servidor:
En Azure Portal, seleccione app Service.
Haga clic en la opción de menú autenticación y autorización .
En las direcciones URL externas permitidas de redirección, escriba
url_scheme_of_your_app://easyauth.callback
. El url_scheme_of_your_app de esta cadena de texto es el esquema URL de la aplicación móvil. Debe seguir la especificación de dirección URL normal para un protocolo (use solo letras y números y comience con una letra). Debe tomar nota de la cadena que elija, ya que deberá ajustar el código de la aplicación móvil con el esquema de dirección URL en varios lugares.Haz clic en Aceptar.
Haz clic en Guardar.
Restricción de permisos a usuarios autenticados
De forma predeterminada, las API de un back-end de Mobile Apps se pueden invocar de forma anónima. A continuación, debe restringir el acceso solo a clientes autenticados.
Node.js back-end (a través de Azure Portal) :
En la configuración de Mobile Apps, haga clic en Tablas fáciles y seleccione la tabla. Haga clic en Cambiar permisos, seleccione Acceso autenticado solo para todos los permisos y, a continuación, haga clic en Guardar.
backend de .NET (C#):
En el proyecto de servidor, vaya a Controladores>TodoItemController.cs. Agregue el atributo
[Authorize]
a la clase TodoItemController, como se indica a continuación. Para restringir el acceso solo a métodos específicos, también puede aplicar este atributo solo a esos métodos en lugar de a la clase . Vuelva a publicar el proyecto de servidor.[Authorize] public class TodoItemController : TableController<TodoItem>
Node.js backend (mediante código Node.js) :
Para requerir autenticación para el acceso a tablas, agregue la siguiente línea al script de servidor de Node.js:
table.access = 'authenticated';
Para obtener más información, consulte Cómo: Requerir autenticación para el acceso a tablas. Para obtener información sobre cómo descargar el proyecto de código de inicio rápido desde el sitio, consulte Cómo: Descargar el proyecto de código de inicio rápido de back-end de Node.js mediante Git.
Adición de autenticación a la biblioteca de clases portable
Mobile Apps usa el método de extensión LoginAsync en el MobileServiceClient de para iniciar sesión de un usuario con la autenticación de App Service. En este ejemplo se usa un flujo de autenticación administrada por el servidor que muestra la interfaz de inicio de sesión del proveedor en la aplicación. Para obtener más información, consulte autenticación administrada por el servidor. Para proporcionar una mejor experiencia de usuario en la aplicación de producción, debe considerar la posibilidad de usar autenticación administrada por el cliente.
Para autenticarse con un proyecto de Xamarin Forms, defina una interfaz IAuthenticate en la biblioteca de clases portable para la aplicación. A continuación, agregue un botón inicio de sesión a la interfaz de usuario definida en la biblioteca de clases portable, que haga clic para iniciar la autenticación. Los datos se cargan desde el back-end de la aplicación móvil después de la autenticación correcta.
Implemente la interfaz IAuthenticate para cada plataforma compatible con su aplicación.
En Visual Studio o Xamarin Studio, abra App.cs desde el proyecto con Portable en el nombre, que es el proyecto Biblioteca de clases portable y agregue la siguiente instrucción
using
:```csharp using System.Threading.Tasks; ```
En App.cs, agregue la siguiente definición de interfaz
IAuthenticate
inmediatamente antes de la definición de claseApp
.```csharp public interface IAuthenticate { Task<bool> Authenticate(); } ```
Para inicializar la interfaz con una implementación específica de la plataforma, agregue los siguientes miembros estáticos a la clase App.
```csharp public static IAuthenticate Authenticator { get; private set; } public static void Init(IAuthenticate authenticator) { Authenticator = authenticator; } ```
Abra TodoList.xaml desde el proyecto Biblioteca de Clases Portátil, agregue el siguiente elemento Button en el elemento de diseño buttonsPanel, después del botón existente:
```xml <Button x:Name="loginButton" Text="Sign-in" MinimumHeightRequest="30" Clicked="loginButton_Clicked"/> ```
Este botón desencadena la autenticación administrada por el servidor con el back-end de la aplicación móvil.
Abra TodoList.xaml.cs desde el proyecto Biblioteca de clases portable y agregue el siguiente campo a la clase
TodoList
:```csharp // Track whether the user has authenticated. bool authenticated = false; ```
Reemplace el método OnAppearing por el código siguiente:
```csharp protected override async void OnAppearing() { base.OnAppearing(); // Refresh items only when authenticated. if (authenticated == true) { // Set syncItems to true in order to synchronize the data // on startup when running in offline mode. await RefreshItems(true, syncItems: false); // Hide the Sign-in button. this.loginButton.IsVisible = false; } } ```
Este código garantiza que los datos solo se actualicen desde el servicio después de autenticarse.
Agregue el siguiente controlador para el evento Clicked a la clase TodoList.
```csharp async void loginButton_Clicked(object sender, EventArgs e) { if (App.Authenticator != null) authenticated = await App.Authenticator.Authenticate(); // Set syncItems to true to synchronize the data on startup when offline is enabled. if (authenticated == true) await RefreshItems(true, syncItems: false); } ```
Guarde los cambios y recompile el proyecto Biblioteca de clases portable que compruebe que no hay errores.
Adición de autenticación a la aplicación Android
En esta sección se muestra cómo implementar la interfaz IAuthenticate en el proyecto de aplicación de Android. Omita esta sección si no admite dispositivos Android.
En Visual Studio o Xamarin Studio, haga clic con el botón derecho en el proyecto de droid y, a continuación, Establecer como proyecto de inicio.
Presione F5 para iniciar el proyecto en el depurador y compruebe que se genera una excepción no controlada con un código de estado 401 (no autorizado) después de que se inicie la aplicación. El código 401 se genera porque el acceso en el back-end está restringido solo a los usuarios autorizados.
Abra MainActivity.cs en el proyecto de Android y agregue las siguientes instrucciones
using
:```csharp using Microsoft.WindowsAzure.MobileServices; using System.Threading.Tasks; ```
Actualice la clase MainActivity para implementar la interfaz IAuthenticate, como se indica a continuación:
```csharp public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity, IAuthenticate ```
Actualice la clase MainActivity agregando un campo MobileServiceUser y un método Authenticate, que requiere la interfaz IAuthenticate, como se indica a continuación:
```csharp // Define an authenticated user. private MobileServiceUser user; public async Task<bool> Authenticate() { var success = false; var message = string.Empty; try { // Sign in with Facebook login using a server-managed flow. user = await TodoItemManager.DefaultManager.CurrentClient.LoginAsync(this, MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}"); if (user != null) { message = string.Format("you are now signed-in as {0}.", user.UserId); success = true; } } catch (Exception ex) { message = ex.Message; } // Display the success or failure message. AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.SetMessage(message); builder.SetTitle("Sign-in result"); builder.Create().Show(); return success; } public override void OnResume() { base.OnResume(); Xamarin.Essentials.Platform.OnResume(); } ```
Si usa un proveedor de identidades distinto de Facebook, elija un valor diferente para MobileServiceAuthenticationProvider.
Actualice el archivo AndroidManifest.xml agregando el siguiente XML dentro del elemento
<application>
:<activity android:name="com.microsoft.windowsazure.mobileservices.authentication.RedirectUrlActivity" android:launchMode="singleTop" android:noHistory="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="{url_scheme_of_your_app}" android:host="easyauth.callback" /> </intent-filter> </activity>
Reemplaza
{url_scheme_of_your_app}
por el esquema de URL.Agregue el código siguiente al método OnCreate de la clase MainActivity antes de la llamada a
LoadApplication()
:```csharp // Initialize the authenticator before loading the app. App.Init((IAuthenticate)this); ```
Este código garantiza que el autenticador se inicialice antes de que se cargue la aplicación.
Vuelva a generar la aplicación, ejecútelo e inicie sesión con el proveedor de autenticación que eligió y compruebe que puede acceder a los datos como un usuario autenticado.
Solución de problemas
La aplicación se bloqueó con Java.Lang.NoSuchMethodError: No static method startActivity
En algunos casos, los conflictos en los paquetes de soporte técnico se muestran como una advertencia en Visual Studio, pero la aplicación se bloquea con esta excepción en tiempo de ejecución. En este caso, debe asegurarse de que todos los paquetes de soporte técnico a los que se hace referencia en el proyecto tengan la misma versión. El Azure Mobile Apps NuGet paquete tiene una Xamarin.Android.Support.CustomTabs
dependencia en la plataforma Android, por lo que si tu proyecto utiliza paquetes de soporte más recientes, debes instalar este paquete con la versión requerida directamente para evitar conflictos.
Adición de autenticación a la aplicación de iOS
En esta sección se muestra cómo implementar la interfaz IAuthenticate en el proyecto de aplicación de iOS. Omita esta sección si no admite dispositivos iOS.
En Visual Studio o Xamarin Studio, haga clic con el botón derecho en el proyecto iOS y a continuación Establecer como proyecto de inicio.
Presione F5 para iniciar el proyecto en el depurador y compruebe que se genera una excepción no controlada con un código de estado 401 (no autorizado) después de que se inicie la aplicación. La respuesta 401 se produce porque el acceso en el back-end está restringido solo a los usuarios autorizados.
Abra AppDelegate.cs en el proyecto de iOS y agregue las siguientes instrucciones
using
:```csharp using Microsoft.WindowsAzure.MobileServices; using System.Threading.Tasks; ```
Actualice la clase AppDelegate para implementar la interfaz IAuthenticate, como se indica a continuación:
```csharp public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate, IAuthenticate ```
Actualice la clase AppDelegate agregando un campo MobileServiceUser y un método Authenticate, que requiere la interfaz IAuthenticate, como se indica a continuación:
```csharp // Define an authenticated user. private MobileServiceUser user; public async Task<bool> Authenticate() { var success = false; var message = string.Empty; try { // Sign in with Facebook login using a server-managed flow. if (user == null) { user = await TodoItemManager.DefaultManager.CurrentClient .LoginAsync(UIApplication.SharedApplication.KeyWindow.RootViewController, MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}"); if (user != null) { message = string.Format("You are now signed-in as {0}.", user.UserId); success = true; } } } catch (Exception ex) { message = ex.Message; } // Display the success or failure message. UIAlertController avAlert = UIAlertController.Create("Sign-in result", message, UIAlertControllerStyle.Alert); avAlert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null)); UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(avAlert, true, null); return success; } ```
Si usa un proveedor de identidades distinto de Facebook, elija otro valor para [MobileServiceAuthenticationProvider].
Actualice la clase AppDelegate agregando la sobrecarga del método OpenUrl, como se indica a continuación:
```csharp public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options) { if (TodoItemManager.DefaultManager.CurrentClient.ResumeWithURL(app, url, options)) return true; return base.OpenUrl(app, url, options); } ```
Agregue la siguiente línea de código al método FinishedLaunching antes de la llamada a
LoadApplication()
:```csharp App.Init(this); ```
Este código garantiza que el autenticador se inicialice antes de cargar la aplicación.
Abra Info.plist y añada un tipo de URL. Establezca el Identificador por un nombre de su elección, los Esquemas de URL por el esquema de URL de su aplicación, y el Rol por Ninguno.
Vuelva a generar la aplicación, ejecútelo e inicie sesión con el proveedor de autenticación que eligió y compruebe que puede acceder a los datos como un usuario autenticado.
Agregar autenticación a proyectos de aplicaciones de Windows 10 (incluido Phone)
En esta sección se muestra cómo implementar la interfaz IAuthenticate en los proyectos de aplicación de Windows 10. Los mismos pasos se aplican a los proyectos de la Plataforma Universal de Windows (UWP), pero se utiliza el proyecto UWP de (con cambios anotados). Omita esta sección si no admite dispositivos Windows.
En Visual Studio, haga clic con el botón derecho en el proyecto de de UWP de y luego Establecer como proyecto de inicio.
Presione F5 para iniciar el proyecto en el depurador y compruebe que se genera una excepción no controlada con un código de estado 401 (no autorizado) después de que se inicie la aplicación. La respuesta 401 se produce porque el acceso en el back-end está restringido solo a los usuarios autorizados.
Abra MainPage.xaml.cs para el proyecto de aplicación de Windows y agregue las siguientes instrucciones
using
:```csharp using Microsoft.WindowsAzure.MobileServices; using System.Threading.Tasks; using Windows.UI.Popups; using <your_Portable_Class_Library_namespace>; ```
Reemplace
<your_Portable_Class_Library_namespace>
por el espacio de nombres de la biblioteca de clases portable.Actualice la clase MainPage para implementar la interfaz IAuthenticate, como se indica a continuación:
public sealed partial class MainPage : IAuthenticate
Actualice la clase mainPage agregando un campo MobileServiceUser y un método Authenticate, que requiere la interfaz IAuthenticate, como se indica a continuación:
```csharp // Define an authenticated user. private MobileServiceUser user; public async Task<bool> Authenticate() { string message = string.Empty; var success = false; try { // Sign in with Facebook login using a server-managed flow. if (user == null) { user = await TodoItemManager.DefaultManager.CurrentClient .LoginAsync(MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}"); if (user != null) { success = true; message = string.Format("You are now signed-in as {0}.", user.UserId); } } } catch (Exception ex) { message = string.Format("Authentication Failed: {0}", ex.Message); } // Display the success or failure message. await new MessageDialog(message, "Sign-in result").ShowAsync(); return success; } ```
Si usa un proveedor de identidades distinto de Facebook, elija un valor diferente para MobileServiceAuthenticationProvider.
Agregue la siguiente línea de código en el constructor de la clase MainPage antes de la llamada a
LoadApplication()
:```csharp // Initialize the authenticator before loading the app. <your_Portable_Class_Library_namespace>.App.Init(this); ```
Reemplace
<your_Portable_Class_Library_namespace>
por el espacio de nombres de la biblioteca de clases portable.Si estás utilizando UWP, agrega la sobrescritura del método OnActivated a la clase App:
```csharp protected override void OnActivated(IActivatedEventArgs args) { base.OnActivated(args); if (args.Kind == ActivationKind.Protocol) { ProtocolActivatedEventArgs protocolArgs = args as ProtocolActivatedEventArgs; MobileServiceClientExtensions.ResumeWithURL(TodoItemManager.DefaultManager.CurrentClient,protocolArgs.Uri); } } ```
Abra Package.appxmanifest y agregue la declaración de Protocolo . Establezca el Nombre para mostrar en un nombre de su elección y el Nombre en el esquema de dirección URL de la aplicación.
Vuelva a generar la aplicación, ejecútelo e inicie sesión con el proveedor de autenticación que eligió y compruebe que puede acceder a los datos como un usuario autenticado.
Pasos siguientes
Ahora que ha completado este tutorial de autenticación básica, considere la posibilidad de continuar con uno de los siguientes tutoriales:
Agregar notificaciones push a la aplicación
Aprenda a agregar compatibilidad con notificaciones push a la aplicación y a configurar el back-end de la aplicación móvil para usar Azure Notification Hubs para enviar notificaciones push.
Habilitar sincronización sin conexión para la aplicación
Obtenga información sobre cómo agregar compatibilidad sin conexión con la aplicación mediante un back-end de aplicación móvil. La sincronización sin conexión permite a los usuarios finales interactuar con una aplicación móvil ( ver, agregar o modificar datos), incluso cuando no hay ninguna conexión de red.