Compartir a través de


Autenticación, roles y perfiles

Puede agregar el servicio de dominio de autenticación a su solución de WCF RIA Services cuando desee comprobar las credenciales de un usuario, restringir el acceso para ciertas operaciones o conservar las propiedades para cada usuario desde su proyecto de cliente. En una aplicación web ASP.NET tradicional, puede utilizar el marco de pertenencia a ASP.NET para realizar estas funciones. RIA Services se basa en el marco de pertenencia a ASP.NET exponiendo el marco de pertenencia a los clientes de Internet enriquecidos a través del servicio de dominio de autenticación. Después de agregar un servicio de dominio de autenticación, puede habilitar las siguientes funciones:

  • Autenticación: para comprobar las credenciales de un usuario y marcarlo como que ha iniciado sesión o ha cerrado sesión.

  • Roles: para agrupar a los usuarios por responsabilidades y conceder permisos de recurso a los miembros autenticados de un grupo.

  • Perfiles: para conservar las propiedades para los usuarios autenticados y recuperar esas propiedades en la aplicación.

En este tema se presenta cómo utilizar autenticación, roles y perfiles en una solución de RIA Services.

Servicio de dominio de autenticación

RIA Services proporciona la plantilla DomainService de autenticación para facilitar el acceso a autenticación, roles y perfiles en el nivel de presentación. Para crear un servicio de dominio de autenticación, solo tiene que crear un nuevo elemento en el proyecto de servidor y seleccionar la plantilla DomainService de autenticación al crear el elemento.

RIA_ServicesAddAuth

Cuando se agrega un servicio de dominio de autenticación, el marco de RIA Services agrega automáticamente dos clases al proyecto de servidor. La clase que representa el servicio de autenticación deriva de la clase AuthenticationBase. La clase que representa al usuario deriva de la clase UserBase. La clase de usuario contiene las propiedades de perfil para un usuario autenticado.

Cuando se genera la solución, RIA Services genera automáticamente una clase WebContext en el proyecto de cliente. La clase WebContext permite el acceso al servicio de dominio de autenticación y al usuario en el proyecto de cliente. Puede utilizar la propiedad Current para recuperar la instancia actual de WebContext. La clase WebContext deriva de WebContextBase.

Para obtener un ejemplo de cómo agregar un servicio de dominio de autenticación a una solución de RIA Services, vea Tutorial: utilizar el servicio de autenticación con una aplicación de navegación de Silverlight.

Aplicación de negocios de Silverlight y autenticación

Cuando se selecciona la plantilla Aplicación de negocios de Silverlight para crear una solución, la solución incluye automáticamente un servicio de dominio de autenticación y controles para administrar el inicio de sesión y el registro de usuarios. De forma predeterminada, la solución utiliza la autenticación mediante formularios, pero se puede configurar fácilmente para la autenticación de Windows. Se habilitan roles y se define una propiedad de perfil. Para obtener un ejemplo de las características de autenticación que se incluyen de forma predeterminada en una aplicación de negocios de Silverlight y de cómo se puede cambiar la configuración de autenticación mediante formularios a autenticación de Windows, vea Tutorial: utilizar la plantilla de aplicación de negocios de Silverlight. Para obtener un ejemplo de generación de las características predeterminadas en una aplicación de negocios de Silverlight, vea Tutorial: utilizar el servicio de autenticación con una aplicación de negocios de Silverlight.

La siguiente ilustración muestra la ventana de registro, que es una de las características predeterminadas incluidas en la aplicación de negocios de Silverlight.

Cuadro de diálogo Registrar

Autenticación

RIA Services proporciona clases que permiten implementar fácilmente la autenticación mediante formularios o la autenticación de Windows en la solución. Para utilizar la autenticación en la solución de RIA Services, debe configurar el proyecto de servidor y el proyecto de cliente para la autenticación. Para obtener más información, vea Habilitar autenticación en RIA Services.

Después de configurar los proyectos de cliente y de servidor, puede hacer que los usuarios inicien sesión asincrónicamente desde la aplicación de Silverlight llamando al método Login en el objeto WebContext. Cuando se utiliza la autenticación de Windows o cuando se recupera a un usuario con credenciales persistentes, no se tiene que llamar al método Login. En su lugar, hay que llamar al método LoadUser para recuperar al usuario que se autentica a través de la autenticación de Windows o para cargar a un usuario con credenciales persistentes.

Los métodos y propiedades siguientes se utilizan normalmente en el proyecto de cliente cuando se ha implementado la autenticación.

Miembro Código que se utiliza Tarea

Authentication

WebContext.Current.Authentication

Obtener acceso al servicio de autenticación.

User

WebContext.Current.User

Obtener acceso al objeto que contiene el estado del usuario.

Login

O bien

Login

O bien

Login

WebContext.Current.Authentication.Login(string, string)

O bien

WebContext.Current.Authentication.Login(LoginParameters)

O bien

WebContext.Current.Authentication.Login(LoginParameters, LoginOperation, object)

Comprobar asincrónicamente las credenciales del usuario.

Logout

O bien

Logout

WebContext.Current.Authentication.Logout(boolean)

O bien

WebContext.Current.Authentication.Logout(LogoutOperation, object)

Cerrar sesión asincrónicamente de un usuario autenticado.

LoadUser

O bien

LoadUser

WebContext.Current.Authentication.LoadUser()

O bien

WebContext.Current.Authentication.LoadUser(LoadUserOperation, object)

Cargar un usuario autenticado, actualizar el estado del usuario, cargar autenticación de usuario persistente o recuperar el objeto de usuario principal cuando se utiliza con autenticación de Windows.

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;
}

Roles

Después de haber implementado la autenticación, puede configurar la solución para utilizar roles. Con roles, puede asignar usuarios a grupos. A continuación, puede especificar que una operación de dominio determinada solo esté disponible para los miembros de ese rol. La restricción de acceso a una operación de dominio se obtiene aplicando el atributo RequiresRoleAttribute a la operación de dominio. Para obtener más información, vea Habilitar roles en RIA Services.

Los métodos y propiedades siguientes se utilizan normalmente cuando se han implementado roles.

Miembro Código que se utiliza Tarea

Roles

WebContext.Current.User.Roles

Obtener acceso a los roles a los que está asignado el usuario.

IsInRole

WebContext.Current.User.IsInRole(string)

Determinar si el usuario autenticado es miembro de un rol especificado.

En el ejemplo siguiente se muestra una operación de dominio con acceso restringido a los miembros de un rol denominado Managers.

<RequiresRole("Managers")> _
Public Function GetCustomers() As IQueryable(Of Customer)
    Return Me.ObjectContext.Customers
End Function
[RequiresRole("Managers")]
public IQueryable<Customer> GetCustomers()
{
    return this.ObjectContext.Customers;
}

Si llama a una operación de dominio pero el usuario no tiene las credenciales necesarias, la operación de dominio devuelve una excepción. Puede evitar esta situación comprobando las credenciales antes de llamar a la operación de dominio. En el ejemplo siguiente se muestra cómo comprobar si el usuario es miembro del rol necesario antes de cargar los datos.

Private Sub LoadRestrictedReports()
    Dim loadSales = context.Load(context.GetSalesOrderHeadersQuery().Take(numberOfRows))
    SalesOrdersGrid.ItemsSource = loadSales.Entities
    SalesOrdersGrid.Visibility = System.Windows.Visibility.Visible

    If (WebContext.Current.User.IsInRole("Managers")) Then
        Dim loadCustomers = context.Load(context.GetCustomersQuery().Take(numberOfRows))
        CustomersGrid.ItemsSource = loadCustomers.Entities
        CustomersGrid.Visibility = System.Windows.Visibility.Visible
    Else
        CustomersGrid.Visibility = System.Windows.Visibility.Collapsed
    End If
End Sub
private void LoadRestrictedReports()
{
    LoadOperation<SalesOrderHeader> loadSales = context.Load(context.GetSalesOrderHeadersQuery().Take(numberOfRows));
    SalesOrdersGrid.ItemsSource = loadSales.Entities;
    SalesOrdersGrid.Visibility = System.Windows.Visibility.Visible;

    if (WebContext.Current.User.IsInRole("Managers"))
    {
        LoadOperation<Customer> loadCustomers = context.Load(context.GetCustomersQuery().Take(numberOfRows));
        CustomersGrid.ItemsSource = loadCustomers.Entities;
        CustomersGrid.Visibility = System.Windows.Visibility.Visible;
    }
    else
    {
        CustomersGrid.Visibility = System.Windows.Visibility.Collapsed;
    }
}

Perfiles

Las propiedades de perfil permiten guardar información sobre el usuario. Puede utilizar estas propiedades para personalizar la aplicación para cada usuario. Para utilizar perfiles en la solución, debe configurarla para perfiles. Para obtener más información, vea Habilitar perfiles en RIA Services.

Los métodos y propiedades siguientes se utilizan normalmente cuando se han implementado perfiles.

Miembro Código que se utiliza Tarea

User

WebContext.Current.User

Obtener acceso al objeto que contiene todas las propiedades que ha agregado a la clase User; por ejemplo, User.PhoneNumber.

LoadUser

O bien

LoadUser

WebContext.Current.Authentication.LoadUser()

O bien

WebContext.Current.Authentication.LoadUser(LoadUserOperation, object)

Actualizar el estado del usuario.

SaveUser

O bien

SaveUser

WebContext.Current.Authentication.SaveUser(boolean)

O bien

WebContext.Current.Authentication.SaveUser(SaveUserOperation, object)

Guardar los cambios en el estado del usuario; por ejemplo, después de establecer el valor de propiedad de un perfil.

En el ejemplo siguiente se muestra cómo establecer una propiedad de usuario basándose en el valor seleccionado por el usuario.

Private Sub OKButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles OKButton.Click
    Dim newSelection = Integer.Parse(defaultRows.SelectionBoxItem.ToString())
    If (newSelection <> WebContext.Current.User.DefaultRows) Then
        WebContext.Current.User.DefaultRows = newSelection
        WebContext.Current.Authentication.SaveUser(True)
    End If
    Me.DialogResult = True
End Sub
private void OKButton_Click(object sender, RoutedEventArgs e)
{
    int newSelection = int.Parse(defaultRows.SelectionBoxItem.ToString());
    if (newSelection != WebContext.Current.User.DefaultRows)
    {
        WebContext.Current.User.DefaultRows = newSelection;
        WebContext.Current.Authentication.SaveUser(true);
    }
    this.DialogResult = true;
}

Controlar errores de autenticación en el cliente

Puede controlar los errores que surgen al iniciar sesión, cerrar sesión y cargar o guardar usuarios proporcionando un método de devolución de llamada como parámetro cuando se llama a esos métodos. En el método de devolución de llamada, se agrega código para controlar el error y se llama al método MarkErrorAsHandled para especificar que el marco no producirá una excepción. La clase AuthenticationService permite proporcionar un método de devolución de llamada cuando se llama a los métodos siguientes:

  • LoadUser

  • Login

  • Logout

  • SaveUser

El ejemplo de la sección "Autenticación" anterior muestra un método de devolución de llamada para la operación Login que controla los errores.

Para obtener más información, vea Control de errores en el cliente.

Restringir el acceso a un servicio de dominio

Después de haber implementado autenticación y roles, puede restringir el acceso en un servicio de dominio a solamente usuarios determinados. Puede aplicar los atributos siguientes al servicio de dominio completo o a las operaciones individuales en el servicio. Cuando se aplica un atributo al servicio completo, se aplica a todas las operaciones.

  • RequiresAuthenticationAttribute: especifica que solo los usuarios con credenciales de autenticación válidas pueden tener acceso a la operación.

  • RequiresRoleAttribute: especifica que solo los usuarios autenticados que pertenecen a los roles especificados pueden tener acceso a la operación.

También puede crear su propio atributo de autorización personalizado. Para obtener más información, vea Crear un atributo de autorización personalizado.

En el ejemplo siguiente se muestra un servicio de dominio con tres operaciones de dominio. Los atributos RequiresRoleAttribute y RequiresAuthenticationAttribute se utilizan para restringir el acceso. La operación de dominio GetProducts está disponible para cualquier usuario, GetSalesOrderHeaders está disponible para los usuarios autenticados y GetCustomers está disponible solo para los usuarios del rol Managers.

<EnableClientAccess()>  _
Public Class AdventureWorksDomainService
    Inherits LinqToEntitiesDomainService(Of AdventureWorksLT_DataEntities)

    <RequiresRole("Managers")> _
    Public Function GetCustomers() As IQueryable(Of Customer)
        Return Me.ObjectContext.Customers
    End Function
    
    Public Function GetProducts() As IQueryable(Of Product)
        Return Me.ObjectContext.Products
    End Function

    <RequiresAuthentication()> _
    Public Function GetSalesOrderHeaders() As IQueryable(Of SalesOrderHeader)
        Return Me.ObjectContext.SalesOrderHeaders
    End Function
End Class
[EnableClientAccess()]
public class AdventureWorksDomainService : LinqToEntitiesDomainService<AdventureWorksLT_DataEntities>
{
    [RequiresRole("Managers")]
    public IQueryable<Customer> GetCustomers()
    {
        return this.ObjectContext.Customers;
    }
 
    public IQueryable<Product> GetProducts()
    {
        return this.ObjectContext.Products;
    }

    [RequiresAuthentication()]
    public IQueryable<SalesOrderHeader> GetSalesOrderHeaders()
    {
        return this.ObjectContext.SalesOrderHeaders;
    }
}

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

Conceptos

Seguridad para WCF RIA Services