Habilitar autenticación en RIA Services
En este tema se muestra cómo habilitar la autenticación de usuario en la aplicación utilizando WCF RIA Services. Se muestra el código que se debe agregar tanto al proyecto de servidor como al proyecto de cliente para que la autenticación esté disponible como un servicio para la aplicación cliente. Puede restringir el acceso a una operación de dominio únicamente a los usuarios autenticados aplicando el atributo RequiresAuthenticationAttribute a la operación de dominio.
La autenticación de WCF RIA Services se basa en el marco de autenticación de ASP.NET. Para obtener más información sobre la autenticación de ASP.NET, vea Introducción a la pertenencia.
Para configurar el proyecto de servidor
En el proyecto de servidor, abra el archivo Web.config.
En el elemento
<system.web>
, agregue un elemento<authentication>
.Establezca la propiedad
mode
en el modo de autenticación que utilizará en el proyecto.En el siguiente código se muestra el elemento
<authentication>
conmode
establecido enForms
. Establezca la propiedadmode
enWindows
para utilizar la autenticación de Windows. El archivo Web.config contendrá otros elementos.<system.web> <authentication mode="Forms"></authentication> </system.web>
Guarde el archivo Web.config.
En el Explorador de soluciones, haga clic con el botón secundario en el proyecto de servidor, seleccione Agregar y, a continuación, Nuevo elemento.
Aparece el cuadro de diálogo Agregar nuevo elemento.
Seleccione la plantilla DomainService de autenticación y especifique un nombre para el servicio.
Haga clic en Agregar.
Para restringir el acceso a una operación de dominio únicamente a los usuarios autenticados, aplique el atributo RequiresAuthenticationAttribute a dicha operación de dominio.
En el ejemplo siguiente se especifica que solo los usuarios autenticados pueden tener acceso al método
GetSalesOrderHeaders
.<RequiresAuthentication()> _ Public Function GetSalesOrderHeaders() As IQueryable(Of SalesOrderHeader) Return Me.ObjectContext.SalesOrderHeaders End Function
[RequiresAuthentication()] public IQueryable<SalesOrderHeader> GetSalesOrderHeaders() { return this.ObjectContext.SalesOrderHeaders; }
Genere la solución.
Para configurar el servicio de autenticación en el proyecto de cliente
En el proyecto de cliente, abra el archivo de código subyacente para el archivo App.xaml (App.xaml.cs o App.xaml.vb).
En el constructor, cree una instancia de la clase WebContext.
Establezca la propiedad Authentication en el tipo de autenticación que configuró en el proyecto de servidor y agregue la instancia de WebContext a ApplicationLifetimeObjects.
En el ejemplo siguiente se muestra cómo establecer la autenticación en FormsAuthentication.
Public Sub New() InitializeComponent() Dim webcontext As New WebContext webcontext.Authentication = New System.ServiceModel.DomainServices.Client.ApplicationServices.FormsAuthentication Me.ApplicationLifetimeObjects.Add(webcontext) End Sub
public App() { this.Startup += this.Application_Startup; this.UnhandledException += this.Application_UnhandledException; InitializeComponent(); WebContext webcontext = new WebContext(); webcontext.Authentication = new System.ServiceModel.DomainServices.Client.ApplicationServices.FormsAuthentication(); this.ApplicationLifetimeObjects.Add(webcontext); }
Si está utilizando la autenticación de Windows o desea cargar un usuario que tiene credenciales persistentes, llame al método LoadUser antes de proporcionar al usuario la opción de iniciar sesión.
En el ejemplo siguiente se muestra cómo llamar al método LoadUser desde el método
Application_Startup
.Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup WebContext.Current.Authentication.LoadUser(AddressOf OnLoadUser_Completed, Nothing) Me.RootVisual = New MainPage() End Sub Private Sub OnLoadUser_Completed(ByVal operation As LoadUserOperation) ' Update UI, if necessary End Sub
private void Application_Startup(object sender, StartupEventArgs e) { WebContext.Current.Authentication.LoadUser(OnLoadUser_Completed, null); this.RootVisual = new MainPage(); } private void OnLoadUser_Completed(LoadUserOperation operation) { // update UI, if necessary }
Si es necesario, agregue una página al proyecto de cliente para recopilar las credenciales de usuario.
En el archivo de código subyacente para la página de inicio de sesión, llame al método Login para que inicien sesión los usuarios.
En el ejemplo siguiente se muestra cómo llamar al método Login desde un controlador de eventos para obtener un botón de inicio de sesión. Se incluye un método de devolución de llamada para responder a los resultados de la operación de inicio de sesión.
Private Sub LoginButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Dim lp As LoginParameters = New LoginParameters(UserName.Text, Password.Password) WebContext.Current.Authentication.Login(lp, AddressOf Me.LoginOperation_Completed, Nothing) LoginButton.IsEnabled = False LoginResult.Text = "" End Sub Private Sub LoginOperation_Completed(ByVal lo As LoginOperation) If (lo.HasError) Then LoginResult.Text = lo.Error.Message LoginResult.Visibility = System.Windows.Visibility.Visible lo.MarkErrorAsHandled() ElseIf (lo.LoginSuccess = False) Then LoginResult.Text = "Login failed. Please check user name and password." LoginResult.Visibility = System.Windows.Visibility.Visible ElseIf (lo.LoginSuccess = True) Then SetControlVisibility(True) End If LoginButton.IsEnabled = True End Sub
private void LoginButton_Click(object sender, RoutedEventArgs e) { LoginParameters lp = new LoginParameters(UserName.Text, Password.Password); WebContext.Current.Authentication.Login(lp, this.LoginOperation_Completed, null); LoginButton.IsEnabled = false; LoginResult.Text = ""; } private void LoginOperation_Completed(LoginOperation lo) { if (lo.HasError) { LoginResult.Text = lo.Error.Message; LoginResult.Visibility = System.Windows.Visibility.Visible; lo.MarkErrorAsHandled(); } else if (lo.LoginSuccess == false) { LoginResult.Text = "Login failed. Please check user name and password."; LoginResult.Visibility = System.Windows.Visibility.Visible; } else if (lo.LoginSuccess == true) { SetControlVisibility(true); } LoginButton.IsEnabled = true; }
Para que cierren sesión los usuarios, llame al método Logout.
En el ejemplo siguiente se muestra cómo llamar al método Logout desde un controlador de eventos para obtener un botón de cierre de sesión. Se incluye un método de devolución de llamada para responder a los resultados de la operación de cierre de sesión.
Private Sub LogoutButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) WebContext.Current.Authentication.Logout(AddressOf Me.LogoutOperation_Completed, Nothing) End Sub Private Sub LogoutOperation_Completed(ByVal lo As LogoutOperation) If (Not (lo.HasError)) Then SetControlVisibility(False) Else Dim ew As ErrorWindow = New ErrorWindow("Logout failed.", "Please try logging out again.") ew.Show() lo.MarkErrorAsHandled() End If End Sub
private void LogoutButton_Click(object sender, RoutedEventArgs e) { WebContext.Current.Authentication.Logout(this.LogoutOperation_Completed, null); } private void LogoutOperation_Completed(LogoutOperation lo) { if (!lo.HasError) { SetControlVisibility(false); } else { ErrorWindow ew = new ErrorWindow("Logout failed.", "Please try logging out again."); ew.Show(); lo.MarkErrorAsHandled(); } }
Para comprobar si un usuario está autenticado, recupere la propiedad IsAuthenticated en la entidad User generada.
En el ejemplo siguiente se comprueba si el usuario actual está autenticado antes de recuperar una propiedad de perfil y llamar a una operación de dominio.
Private Sub LoadReports() If (WebContext.Current.User.IsAuthenticated) Then numberOfRows = WebContext.Current.User.DefaultRows AddHandler WebContext.Current.User.PropertyChanged, AddressOf User_PropertyChanged LoadRestrictedReports() Else CustomersGrid.Visibility = System.Windows.Visibility.Collapsed SalesOrdersGrid.Visibility = System.Windows.Visibility.Collapsed End If Dim loadProducts = context.Load(context.GetProductsQuery().Take(numberOfRows)) ProductsGrid.ItemsSource = loadProducts.Entities End Sub
private void LoadReports() { if (WebContext.Current.User.IsAuthenticated) { numberOfRows = WebContext.Current.User.DefaultRows; WebContext.Current.User.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(User_PropertyChanged); LoadRestrictedReports(); } else { CustomersGrid.Visibility = System.Windows.Visibility.Collapsed; SalesOrdersGrid.Visibility = System.Windows.Visibility.Collapsed; } LoadOperation<Product> loadProducts = context.Load(context.GetProductsQuery().Take(numberOfRows)); ProductsGrid.ItemsSource = loadProducts.Entities; }
Si desea que el objeto WebContext esté disponible en código XAML, agregue la instancia de WebContext actual a los recursos de aplicación en el evento Application.Startup antes de crear el objeto visual raíz.
En el ejemplo siguiente se muestra cómo agregar la instancia de WebContext como un recurso de aplicación.
Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup Me.Resources.Add("WebContext", WebContext.Current) Me.RootVisual = New MainPage() End Sub
private void Application_Startup(object sender, StartupEventArgs e) { this.Resources.Add("WebContext", WebContext.Current); this.RootVisual = new MainPage(); }
Vea también
Tareas
Tutorial: utilizar el servicio de autenticación con una aplicación de navegación de Silverlight
Tutorial: utilizar el servicio de autenticación con una aplicación de negocios de Silverlight