Procedura: abilitare l'autenticazione in Servizi RIA

In questo argomento viene illustrato come si abilita l'autenticazione dell'utente nell'applicazione tramite WCF RIA Services. Viene illustrato il codice che è necessario aggiungere al progetto server e al progetto client per rendere disponibile l'autenticazione come servizio dell'applicazione client. È possibile limitare l'accesso a un'operazione di dominio ai soli utenti autenticati applicando l'attributo RequiresAuthenticationAttribute all'operazione di dominio.

L'autenticazione in WCF RIA Services si basa sul framework di autenticazione in ASP.NET. Per ulteriori informazioni sull'autenticazione ASP.NET, vedere Introduzione all'appartenenza.

Per configurare il progetto server

  1. Aprire il file Web.config nel progetto server.

  2. Nell'elemento <system.web> aggiungere un elemento <authentication>.

  3. Impostare la proprietà mode sulla modalità di autenticazione che si utilizzerà nel progetto.

    Nell'esempio di codice seguente viene illustrato l'elemento <authentication> con mode impostato su Forms. Impostare la proprietà mode su Windows per utilizzare l'autenticazione di Windows. Il file Web.config conterrà altri elementi.

    <system.web>
      <authentication mode="Forms"></authentication>
    </system.web>
    
  4. Salvare il file Web.config.

  5. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto server, scegliere Aggiungi, quindi fare clic su Nuovo elemento.

    Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento.

  6. Selezionare il modello DomainService di autenticazione e specificare un nome per il servizio.

    RIA_ServicesAddAuth

  7. Fare clic su Aggiungi.

  8. Per limitare l'accesso a un'operazione di dominio ai soli utenti autenticati, applicare l'attributo RequiresAuthenticationAttribute all'operazione di dominio.

    Nell'esempio seguente viene indicato che solo gli utenti autenticati possono accedere al metodo 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. Compilare la soluzione.

Per configurare il servizio di autenticazione sul progetto client

  1. Nel progetto client aprire il file code-behind per il file App.xaml (App.xaml.cs o App.xaml.vb).

  2. Nel costruttore, creare un'istanza della classe WebContext.

  3. Impostare la proprietà Authentication sul tipo di autenticazione configurato nel progetto server e aggiungere l'istanza WebContext a ApplicationLifetimeObjects.

    Nell'esempio seguente viene illustrato come impostare l'autenticazione su 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. Se si utilizza l'autenticazione di Windows o si desidera caricare un utente con le credenziali persistenti, chiamare il metodo LoadUser prima di fornire all'utente l'opzione per l'accesso.

    Nell'esempio seguente viene illustrato come chiamare il metodo LoadUser dal metodo 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. Se necessario, aggiungere una pagina al progetto client per la raccolta delle credenziali utente.

  6. Nel file code-behind per la pagina di accesso, chiamare il metodo Login per l'accesso degli utenti.

    Nell'esempio seguente viene illustrato come chiamare il metodo Login da un gestore eventi per un pulsante di accesso. Viene incluso un metodo di callback per rispondere ai risultati dell'operazione di accesso.

    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. Per disconnettere gli utenti, chiamare il metodo Logout.

    Nell'esempio seguente viene illustrato come chiamare il metodo Logout da un gestore eventi per un pulsante di disconnessione. Viene incluso un metodo di callback per rispondere ai risultati dell'operazione di disconnessione.

    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. Per controllare se un utente viene autenticato, recuperare la proprietà IsAuthenticated sull'entità User generata.

    Nell'esempio seguente viene eseguito il controllo dell'autenticazione dell'utente corrente prima di recuperare una proprietà del profilo e chiamare un'operazione di 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. Se si desidera rendere disponibile l'oggetto WebContext in XAML, aggiungere l'istanza WebContext corrente alle risorse dell'applicazione nell'evento Application.Startup prima di creare l'oggetto visivo radice.

    Nell'esempio seguente viene mostrato come aggiungere l'istanza WebContext come risorsa dell'applicazione.

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

Vedere anche

Attività

Procedura dettagliata: utilizzo del servizio di autenticazione con Applicazione di navigazione Silverlight
Procedura dettagliata: utilizzo del servizio di autenticazione con l'applicazione aziendale di Silverlight