Compartir a través de


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

  1. En el proyecto de servidor, abra el archivo Web.config.

  2. En el elemento <system.web>, agregue un elemento <authentication>.

  3. 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> con mode establecido en Forms. Establezca la propiedad mode en Windows para utilizar la autenticación de Windows. El archivo Web.config contendrá otros elementos.

    <system.web>
      <authentication mode="Forms"></authentication>
    </system.web>
    
  4. Guarde el archivo Web.config.

  5. 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.

  6. Seleccione la plantilla DomainService de autenticación y especifique un nombre para el servicio.

    RIA_ServicesAddAuth

  7. Haga clic en Agregar.

  8. 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;
    }
    
  9. Genere la solución.

Para configurar el servicio de autenticación en el proyecto de cliente

  1. En el proyecto de cliente, abra el archivo de código subyacente para el archivo App.xaml (App.xaml.cs o App.xaml.vb).

  2. En el constructor, cree una instancia de la clase WebContext.

  3. 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);
    }
    
  4. 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
    }
    
  5. Si es necesario, agregue una página al proyecto de cliente para recopilar las credenciales de usuario.

  6. 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;
    }
    
  7. 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();
        }
    }
    
  8. 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;
    }
    
  9. 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