Share via


Procedura dettagliata: utilizzo dei servizi delle applicazioni ASP.NET

Aggiornamento: novembre 2007

ASP.NET fornisce servizi applicativi sul Web che consentono alle applicazioni client di accedere all'autenticazione utente, al ruolo e alle informazioni sul profilo. Queste informazioni sono accessibili da applicazioni client scritte in linguaggi diversi ed eseguite in sistemi operativi diversi. L'unico requisito necessario è che questi client siano in grado di comunicare tramite protocollo SOAP 1.1.

Questa procedura dettagliata è divisa nelle parti seguenti:

  • La parte 1 illustra come configurare un sito Web ASP.NET per l'esposizione dei servizi applicativi.

  • La parte 2 illustra come compilare un'applicazione console di Windows che consente di accedere all'autenticazione di un utente, ai ruoli e alle informazioni sul profilo. In questa procedura dettagliata verrà compilata un'applicazione console di Windows. Tuttavia, i servizi delle applicazioni ASP.NET sono disponibili per tutte le applicazioni client in grado di inviare e ricevere messaggi in formato SOAP.

Prerequisiti

Per completare questa procedura dettagliata, è necessario quanto segue:

  • Visual Studio 2008. Non è possibile utilizzare Microsoft Visual Web Developer 2005 per la procedura dettagliata, in quanto verrà creata un'applicazione console di Windows non supportata in Visual Web Developer Express Edition.

  • Microsoft SQL Server o SQL Server Express Edition installato nel computer.

Esposizione dei servizi applicativi

In questa sezione viene descritto come esporre i servizi applicativi come parte di un sito Web ASP.NET in modo tale da renderli accessibili a qualsiasi client sulla rete. La procedura illustrata si applica solo al server.

Nota:

Per questa procedura dettagliata è necessario utilizzare un sito Web di file system. In questa procedura si presuppone che per l'esecuzione degli esempi venga utilizzato il server di sviluppo ASP.NET anziché IIS. Per ulteriori informazioni, vedere la classe Server Web in Visual Web Developer.

Per creare il sito Web dei servizi applicativi

  1. Aprire Visual Studio 2008.

  2. Scegliere Nuovo sito Web dal menu File.

    Verrà visualizzata la finestra di dialogo Nuovo sito Web.

  3. In Modelli Visual Studio installati fare clic su Sito Web ASP.NET.

  4. Selezionare File system nell'elenco Percorso.

  5. Nella casella di testo Cartella, assegnare il nome WcfApplicationServices al sito Web.

    Nota:

    È possibile utilizzare qualsiasi nome. Se si utilizza un nome diverso, annotarlo in modo tale da poterlo sostituire quando necessario più avanti nella procedura.

  6. Scegliere OK.

    Visual Studio crea un nuovo sito Web ASP.NET e apre la pagina Default.aspx.

  7. In Esplora soluzioni fare clic sul nome del sito Web, quindi premere F4 per aprire la finestra Proprietà.

  8. Nella finestra Proprietà impostare Utilizza porte dinamiche su False.

    Così facendo, in Visual Studio verrà specificata una porta fissa anziché una porta casualmente selezionata all'avvio del server di sviluppo ASP.NET. Per questa procedura dettagliata è necessario avere un numero di porta fisso utilizzabile per la generazione delle classi proxy client e dei file di configurazione. Per ulteriori informazioni, vedere la classe Procedura: specificare una porta per il server di sviluppo ASP.NET.

    Nota:

    Non è possibile accedere alla finestra Proprietà sito Web dalla finestra Pagine delle proprietà.

  9. Impostare Numero porta su 8080.

    Nota:

    È possibile utilizzare qualsiasi porta disponibile. Se si utilizza una porta diversa, annotare il numero della porta in modo tale da poterlo sostituire a 8080 più avanti nella procedura.

Le informazioni su appartenenza, ruoli e profilo ASP.NET vengono archiviate in un database, il quale viene creato automaticamente quando necessario. Nella procedura successiva verranno creati utenti e ruoli per l'applicazione, la quale creerà automaticamente il database.

Per creare utenti e informazioni sui ruoli

  1. Aggiungere un file Global.asax al sito Web e all'interno del file sostituire il metodo Application_Start esistente con il codice seguente:

    <%@ Application Language="VB" %>
    
    <script >
    
        Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
            ' Code that runs on application startup
            ' Warning. This code is just for test purposes 
            ' to generate a SQL Express database quickly.
            ' In a production environment, you must set 
            ' a SQL standard database separately.
            If Not Roles.RoleExists("Administrators") Then
                Roles.CreateRole("Administrators")
            End If
            If Not Roles.RoleExists("Friends") Then
                Roles.CreateRole("Friends")
            End If
        End Sub
    
    
    </script>
    
    
    <%@ Application Language="C#" %>
    
    <script >
    
        void Application_Start(object sender, EventArgs e) 
        {
            // Code that runs on application startup
            // Warning. This code is just for test purposes 
            // to generate a SQL Express database quickly.
            // In a production environment, you must set   3-25
            // a SQL standard database separately.
            if (!Roles.RoleExists("Administrators")){
                Roles.CreateRole("Administrators");
    
            }
            if (!Roles.RoleExists("Friends")){
                Roles.CreateRole("Friends");
    
            }
    
        }
    
    
    </script>
    
    

    Quando si esegue l'applicazione Web per la prima volta, il codice crea il database locale Aspnetdb.mdf e vi aggiunge i ruoli Administrators e Friends. Questo database viene utilizzato per archiviare le credenziali utente, i ruoli e le informazioni sul profilo.

  2. I tal modo vengono aggiunti collegamenti per la pagina di accesso, la pagina di informazioni sul profilo e la nuova pagina utente. Queste pagine verranno aggiunte nel corso della procedura dettagliata.

    <%@ Page Language="VB" AutoEventWireup="true" CodeFile="Default.aspx.vb" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" >
        <title>Application Services Home Page</title>
    </head>
    <body>
        <form id="form1" >
        <div>
            <h2>Enter Users' Information</h2>
    
            The following selections enable you to create users, and assign them roles and
            profile information.
    
            <p>
                <asp:Label ID="LoggedId"  Font-Bold="true" ForeColor="red" />
            </p>
    
            <table border="1">
                <tr>
                    <td align="left">Login to change profile</td>
                    <td align="left"><asp:LoginStatus ID="LoginStatus1"  /></td>
                </tr>
                <tr>
                    <td align="left">Define profile information (you must login first)</td>
                    <td align="left"><a href="Profile.aspx" target="_self">Profile Information</a></td>
                </tr>
                <tr>
                    <td align="left">Create user and assign role</td>
                    <td align="left"><a href="CreateUser.aspx"target="_self">New User</a></td>
                </tr>
    
             </table>
        </div>
    
        </form>
    </body>
    </html>
    
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head >
        <title>Application Services Home Page</title>
    </head>
    <body>
        <form id="form1" >
        <div>
            <h2>Enter Users' Information</h2>
    
        The following selections enable you to create users, and assign them roles and
            profile information.
    
            <p>
                <asp:Label ID="LoggedId"  Font-Bold="true" ForeColor="red" />
            </p>
    
            <table border="1">
                <tr>
                    <td align="left">Login to change profile</td>
                    <td align="left"><asp:LoginStatus ID="LoginStatus1"  /></td>
                </tr>
                <tr>
                    <td align="left">Define profile information (you must login first)</td>
                    <td align="left"><a href="Profile.aspx" target="_self">Profile Information</a></td>
                </tr>
                <tr>
                    <td align="left">Create user and assign role</td>
                    <td align="left"><a href="CreateUser.aspx"target="_self">New User</a></td>
                </tr>
    
             </table>
        </div>
    
        </form>
    </body>
    </html>
    
  3. Nel file code-behind Default.aspx aggiungere codice nel metodo Page_Load per verificare se l'utente è stato autenticato.

    Nell'esempio riportato di seguito viene illustrato come verificare se un utente è stato autenticato.

    Imports System
    Imports System.Data
    Imports System.Configuration
    Imports System.Collections
    Imports System.Web
    Imports System.Web.Security
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    Imports System.Web.UI.HtmlControls
    
    Partial Public Class _Default
        Inherits System.Web.UI.Page
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
            If HttpContext.Current.User.Identity.IsAuthenticated Then
                LoggedId.Text = HttpContext.Current.User.Identity.Name + " you are logged in"
            End If
    
        End Sub
    End Class
    
    
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                LoggedId.Text = HttpContext.Current.User.Identity.Name +
                    " you are logged in";
            }
    
        }
    }
    
  4. Aggiungere una pagina denominata Login.aspx. Assicurarsi che Inserisci codice in file separato sia selezionato.

  5. Aggiungere un controllo Login al file Login.aspx.

    Nell'esempio seguente viene illustrato il markup del file Login.aspx:

    <%@ Page Language="VB" AutoEventWireup="true" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head >
        <title>Login Page</title>
    </head>
    <body>
        <form id="form1" >
        <div>
            <asp:Login ID="Login1"    />
        </div>
        </form>
    </body>
    </html>
    
    <%@ Page Language="C#" AutoEventWireup="true" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head >
        <title>Login Page</title>
    </head>
    <body>
        <form id="form1" >
        <div>
            <asp:Login ID="Login1"   />
        </div>
        </form>
    </body>
    </html>
    
  6. Aggiungere una pagina denominata Profile.aspx e verificare che l'opzione Inserisci codice in file separato sia selezionata.

  7. Aggiungere il markup seguente alla pagina Profile.aspx:

    <%@ Page Language="VB" AutoEventWireup="true" CodeFile="Profile.aspx.vb" Inherits="_Profile" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" >
        <title>Profile Page</title>
    </head>
    <body>
        <form id="form1" >
        <div>
            <h3>Current Authenticated User Profile Information</h3> 
    
            <a href="Default.aspx">back to default page</a>
    
            <h4>Read Profile Information</h4>
            <table>
                <tr>
                    <td align="left">User Name</td>
                    <td align="left">
                        <asp:Label ID="Label1"  Text="Label"/>
                    </td>
                </tr>
                <tr>
                    <td align="left">User Roles</td>
                    <td align="left">
                        <asp:Label ID="Label2"  Text="Label"/>
                    </td>
                </tr>
                <tr>
                    <td align="left">First Name</td>
                    <td>
                        <asp:Label ID="Label3"  Text="Label"/>
                    </td>
                </tr>
                <tr>
                    <td align="left">Last Name</td>
                    <td>    
                        <asp:Label ID="Label4"  Text="Label"/>
                    </td>
                </tr>
                <tr>
                    <td align="left">ID#</td>
                    <td>    
                        <asp:Label ID="Label5"  Text="Label"/>
                    </td>
                </tr>
    
            </table>
            <asp:Button ID="Button2"  onclick="Button2_Click" 
                Text="Read Profile Information" />
    
            <hr />
    
            <h3>Update Profile Information </h3>
    
            <table>
                <tr>
                    <td align="left">First Name</td>
                    <td align="left"><asp:TextBox ID="TextBox1" /></td>
                </tr>
                <tr>
                    <td align="left">Last Name</td>
                    <td align="left"><asp:TextBox ID="TextBox2" /></td>
                </tr>
                <tr>
                    <td align="left">ID#</td>
                    <td align="left"><asp:TextBox ID="TextBox3" /></td>
                </tr>
    
            </table>
    
            <asp:Button ID="Button1"  onclick="Button1_Click" 
            Text="Update Profile Data" />
    
        </div>
        </form>
    </body>
    </html>
    
    <%@ Page Language="C#" AutoEventWireup="true" 
    CodeFile="Profile.aspx.cs" Inherits="ProfileInformation" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" >
        <title>Profile Page</title>
    </head>
    <body>
        <form id="form1" >
        <div>
            <h3>Current Authenticated User Profile Information</h3> 
    
            <a href="Default.aspx">back to default page</a>
    
            <h4>Read Profile Information</h4>
            <table>
                <tr>
                    <td align="left">User Name</td>
                    <td align="left">
                        <asp:Label ID="Label1"  Text="Label"/>
                    </td>
                </tr>
                <tr>
                    <td align="left">User Roles</td>
                    <td align="left">
                        <asp:Label ID="Label2"  Text="Label"/>
                    </td>
                </tr>
                <tr>
                    <td align="left">First Name</td>
                    <td>
                        <asp:Label ID="Label3"  Text="Label"/>
                    </td>
                </tr>
                <tr>
                    <td align="left">Last Name</td>
                    <td>    
                        <asp:Label ID="Label4"  Text="Label"/>
                    </td>
                </tr>
                <tr>
                    <td align="left">ID#</td>
                    <td>    
                        <asp:Label ID="Label5"  Text="Label"/>
                    </td>
                </tr>
    
            </table>
            <asp:Button ID="Button2"  onclick="Button2_Click" 
                Text="Read Profile Information" />
    
            <hr />
    
            <h3>Update Profile Information </h3>
    
            <table>
                <tr>
                    <td align="left">First Name</td>
                    <td align="left"><asp:TextBox ID="TextBox1" /></td>
                </tr>
                <tr>
                    <td align="left">Last Name</td>
                    <td align="left"><asp:TextBox ID="TextBox2" /></td>
                </tr>
                <tr>
                    <td align="left">ID#</td>
                    <td align="left"><asp:TextBox ID="TextBox3" /></td>
                </tr>
    
            </table>
    
            <asp:Button ID="Button1"  onclick="Button1_Click" 
            Text="Update Profile Data" />
    
        </div>
        </form>
    </body>
    </html>
    

    La pagina Profile contiene controlli Label utilizzati per visualizzare il nome e il ruolo dell'utente e controlli TextBox utilizzati per modificare l'ID e il nome degli utenti.

  8. Aggiungere il codice seguente al file code-behind della pagina Profile.aspx:

    Imports System
    Imports System.Data
    Imports System.Configuration
    Imports System.Collections
    Imports System.Web
    Imports System.Web.Security
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    Imports System.Web.UI.HtmlControls
    
    Partial Public Class _Profile
        Inherits System.Web.UI.Page
    
        Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    
             Dim Profile As ProfileCommon = TryCast(HttpContext.Current.Profile, ProfileCommon)
    
            If HttpContext.Current.User.Identity.IsAuthenticated Then
    
                Label1.Text = HttpContext.Current.User.Identity.Name
                Dim roles As String() = _
                    System.Web.Security.Roles.GetRolesForUser()
    
                Label2.Text = ""
                For Each r As String In roles
                    Label2.Text += r + " "
                Next
    
                Label3.Text = Profile.FirstName()
                Label4.Text = Profile.LastName
    
                Label5.Text = Profile.EmployeeId
            Else
                Label1.Text = "User is not Authenticated"
                Label1.ForeColor = System.Drawing.Color.Red
            End If
        End Sub
    
        Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs)
            If HttpContext.Current.User.Identity.IsAuthenticated Then
                Label1.Text = HttpContext.Current.User.Identity.Name
                Dim roles As String() = _
                    System.Web.Security.Roles.GetRolesForUser()
                Label2.Text = ""
                For Each r As String In roles
                    Label2.Text += r + " "
                Next
                Label3.Text = Profile.FirstName
                Label4.Text = Profile.LastName
                Label5.Text = Profile.EmployeeId
            Else
                Label1.Text = "User is not Authenticated"
                Label1.ForeColor = System.Drawing.Color.Red
            End If
        End Sub
    
        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
            If HttpContext.Current.User.Identity.IsAuthenticated Then
                Profile.FirstName = TextBox1.Text
                Profile.LastName = TextBox2.Text
                Profile.EmployeeId = TextBox3.Text
            End If
        End Sub
    End Class
    
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    
    public partial class ProfileInformation : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
         ProfileCommon Profile = HttpContext.Current.Profile
                                      as ProfileCommon;
    
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                Label1.Text = HttpContext.Current.User.Identity.Name;
                string[] roles = Roles.GetRolesForUser();
                Label2.Text = "";
                foreach (string r in roles)
                {
                    Label2.Text += r + " ";
                }
    
                Label3.Text = Profile.FirstName;
                Label4.Text = Profile.LastName;
                Label5.Text = Profile.EmployeeId;
    
            }
            else
            {
                Label1.Text = "User is not Authenticated";
                Label1.ForeColor = System.Drawing.Color.Red;
            }
        }
    
        protected void Button2_Click(object sender, EventArgs e)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                Label1.Text = HttpContext.Current.User.Identity.Name;
                string[] roles = Roles.GetRolesForUser();
                Label2.Text = "";
                foreach (string r in roles)
                {
                    Label2.Text += r + " ";
                }
    
                Label3.Text = Profile.FirstName;
                Label4.Text = Profile.LastName;
                Label5.Text = Profile.EmployeeId;
    
            }
            else
            {
                Label1.Text = "User is not Authenticated";
                Label1.ForeColor = System.Drawing.Color.Red;
            }
        }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                Profile.FirstName = TextBox1.Text;
                Profile.LastName = TextBox2.Text;
                Profile.EmployeeId = TextBox3.Text;
            }
        }
    }
    
    Nota:

    Nell'esempio precedente il nome di classe contenuto nel file code-behind è stato modificato in _Profile per evitare un conflitto con l'instanza di Profile.

    Il codice contenuto in questa pagina consente di ottenere e modificare le informazioni sul profilo utente.

    Nota:

    Il progetto verrà compilato soltanto dopo aver attivato le proprietà del profilo nel sito Web. Questa operazione verrà eseguita nella procedura successiva.

  9. Aggiungere una pagina denominata CreateUser.aspx, quindi aggiungervi il seguente markup:

    <%@ Page Language="VB" AutoEventWireup="true" CodeFile="CreateUser.aspx.vb" Inherits="CreateUser" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head >
        <title>Add New User</title>
    </head>
    <body>
        <form id="form1" >
        <div>
    
            <h2>Add New User</h2>
    
            <a href="Default.aspx">back to default page</a>
    
            <asp:CreateUserWizard ID="CreateUserWizard1" 
              OnCreatedUser="On_CreatedUser">
                <wizardsteps>
                    <asp:CreateUserWizardStep ID="CreateUserWizardStep1"   />
                    <asp:CompleteWizardStep ID="CompleteWizardStep1"   />
                </wizardsteps>
            </asp:CreateUserWizard>
            <p> 
                Check the following box to assign the user to the administrator role.
                Otherwise, the user will be assigned to the friends role by default. 
            </p>
            <span style="font-weight:bold; color:Red">Administrator</span> 
            <asp:CheckBox ID="CheckBox1"  />
    
        </div>
        </form>
    </body>
    </html>
    
    <%@ Page Language="C#" AutoEventWireup="true" 
    CodeFile="CreateUser.aspx.cs" Inherits="CreateUser" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" >
        <title>Add New User</title>
    </head>
    <body>
        <form id="form1" >
        <div>
    
            <h2>Add New User</h2>
    
            <a href="Default.aspx">back to default page</a>
    
            <asp:CreateUserWizard ID="CreateUserWizard1" 
              OnCreatedUser="On_CreatedUser">
                <wizardsteps>
                    <asp:CreateUserWizardStep ID="CreateUserWizardStep1"   />
                    <asp:CompleteWizardStep ID="CompleteWizardStep1"   />
                </wizardsteps>
            </asp:CreateUserWizard>
            <p> 
                Check the following box to assign the user to the administrator role.
                Otherwise, the user will be assigned to the friends role by default. 
            </p>
            <span style="font-weight:bold; color:Red">Administrator</span> 
            <asp:CheckBox ID="CheckBox1"  />
    
        </div>
        </form>
    </body>
    </html>
    
  10. Aggiungere il codice seguente al file code-behind della pagina CreateUser.aspx.

    Imports System
    Imports System.Data
    Imports System.Configuration
    Imports System.Collections
    Imports System.Web
    Imports System.Web.Security
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    Imports System.Web.UI.HtmlControls
    
    Partial Public Class CreateUser
        Inherits System.Web.UI.Page
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    
        End Sub
    
        Protected Sub On_CreatedUser(ByVal sender As Object, ByVal e As EventArgs)
            Dim userName As String = CreateUserWizard1.UserName
            If CheckBox1.Checked Then
                HttpContext.Current.Response.Write(userName)
                Roles.AddUserToRole(userName, "Administrators")
            Else
                Roles.AddUserToRole(userName, "Friends")
            End If
    
            CheckBox1.Visible = False
    
            HttpContext.Current.Response.Redirect("~/default.aspx")
        End Sub
    End Class
    
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    
    public partial class CreateUser : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    
        protected void On_CreatedUser(object sender, EventArgs e)
        {
            string userName = CreateUserWizard1.UserName;
            if (CheckBox1.Checked)
            {
                HttpContext.Current.Response.Write(userName);
                Roles.AddUserToRole(userName, "Administrators");
            }
            else
                Roles.AddUserToRole(userName, "Friends");
    
            CheckBox1.Visible = false;
    
            HttpContext.Current.Response.Redirect("~/default.aspx");
        }
    }
    

    Questa pagina consente di creare utenti e assegnarli a un ruolo.

Il passaggio successivo prevede l'attivazione dell'autenticazione basata su form, dei ruoli e delle proprietà del profilo nel sito Web. A tal proposito occorre utilizzare le impostazioni di configurazione nel file Web.config.

Per configurare autenticazione, ruoli e proprietà del profilo

  1. Aprire il file Web.config del sito Web.

  2. Nel gruppo system.web, cambiare l'autenticazione predefinita di Windows nell'autenticazione basata su form come illustrato nell'esempio seguente:

    <authentication mode="Forms" />
    
  3. Nel gruppo system.web, configurare il servizio ruoli aggiungendo l'elemento roleManager, come illustrato nell'esempio seguente:

    <roleManager enabled="true"/>
    
  4. Nel gruppo system.web, configurare il servizio dei profili tramite la sezione profile e il relativo elemento properties, come illustrato nell'esempio seguente:

    <profile enabled="true">
      <properties>
        <add name="FirstName"   type="String"/>
        <add name="LastName"    type="String"/>
        <add name="EmployeeId"  type="String"/>
      </properties>
    </profile>
    

    Questa impostazione di profilo definisce tre proprietà che verranno gestite dal servizio dei profili di ASP.NET. In fase di esecuzione, ASP.NET creerà dinamicamente una classe di tipo ProfileCommon contenente queste proprietà.

    Nell'esempio seguente viene illustrata una parte del file Web.config contenente tutte le modifiche necessarie.

    <system.web>
    <!-- Other settings. -->
    <authentication mode="Forms" />
    <roleManager enabled="true"/>
    <profile enabled="true">
      <properties>
        <add name="FirstName"   type="String"/>
        <add name="LastName"    type="String"/>
        <add name="EmployeeId"  type="String"/>
      </properties>
    </profile>
    </system.web>
    

Ora è possibile creare le informazioni utente che verranno utilizzate in un secondo momento per effettuare l'accesso.

Per creare utenti e assegnare informazioni sul profilo

  1. In Esplora soluzioni, selezionare la pagina Default.aspx e quindi premere CTRL+F5 per eseguirla.

    La pagina viene visualizzata nel browser con l'URL seguente:

    https://localhost:8080/WcfApplicationServices/Default.aspx
    
  2. Scegliere Nuovo utente.

    Verrà visualizzata la pagina CreateUser.aspx.

  3. Creare alcuni utenti e assegnarli ai ruoli predefiniti. A tale scopo, immettere le credenziali dell'utente e fare clic su Crea utente.

    Annotare i nomi utente e le password creati, poiché saranno necessari per assegnare o modificare le informazioni sul profilo utente.

    Creare ad esempio un utente con nome "joeA" e selezionare la casella di controllo Amministratore in modo che l'utente diventi membro del ruolo Administrators. Creare un secondo utente con nome "joeNA" e non selezionare la casella di controllo Amministratore. L'utente joeNA sarà un membro del ruolo Friends, ma non del ruolo Administrators. I ruoli Friends e Administrators vengono creati da codice aggiunto in precedenza al metodo Application_Start nel file Global.asax.

    Una volta creato un utente, si viene reindirizzati alla pagina Default.aspx.

  4. Nella pagina Default.aspx, fare clic su Accesso.

    Verrà visualizzata la pagina Login.aspx.

  5. Effettuare l'accesso utilizzando le credenziali di uno degli utenti precedentemente creati.

    Se l'accesso viene eseguito correttamente, si viene reindirizzati alla pagina Default.aspx.

  6. Fare clic su Informazioni profilo.

    Verrà visualizzata la pagina Profile.aspx.

  7. Immettere o aggiornare le informazioni sul profilo dell'utente connesso immettendo nome, cognome e numero di identificazione.

  8. Fare clic su Aggiorna dati profilo.

  9. Fare clic su Leggi informazioni profilo.

    Vengono visualizzate le informazioni appena immesse. Questo passaggio consente di verificare che le proprietà del profilo funzionino correttamente.

La procedura per la creazione di utenti e informazioni sul profilo è terminata. Ora queste informazioni verranno rese disponibili alle applicazioni client.

Mapping e configurazione dei servizi applicativi

È ora possibile esporre le informazioni dell'utente create tramite i servizi applicativi ASP.NET. Prima di poter accedere alla credenziali utente e alle informazioni sul profilo dal client, è necessario creare file di mapping (SVC) che puntano ai servizi applicativi. In questo modo i servizi saranno disponibili per qualsiasi applicazione eseguita su una piattaforma in grado di inviare e ricevere messaggi SOAP. È necessario inoltre configurare il sito Web in modo tale da esporre i servizi applicativi in rete.

Per creare file di mapping dei servizi applicativi

  1. Aggiungere un file del servizio WCF (SVC) al sito Web e denominarlo MyAuthenSvcWrap.svc.

  2. Sostituire la direttiva @ ServiceHost esistente con la seguente direttiva, che fa riferimento alla classe System.Web.ApplicationServices.AuthenticationService:

    <%@ ServiceHost Language="VB"
      Service="System.Web.ApplicationServices.AuthenticationService" 
      Factory="System.Web.ApplicationServices.ApplicationServicesHostFactory" 
      Debug="true" %>
    
    <%@ ServiceHost Language="C#"
      Service="System.Web.ApplicationServices.AuthenticationService" 
      Factory="System.Web.ApplicationServices.ApplicationServicesHostFactory" 
      Debug="true" %>
    

    Anziché implementare un servizio di autenticazione personalizzato, questo esempio chiama la classe System.Web.ApplicationServices.AuthenticationService incorporata.

  3. Eliminare i file di interfaccia e di classe nella directory App_Code (App_Code\MyAuthenSvcWrap e App_Code\IMyAuthenSvcWrap).

    Questi file sono stati creati quando il file SVC è stato aggiunto al progetto. Poiché in questo caso anziché implementare un servizio personalizzato si sta utilizzando il servizio System.Web.ApplicationServices.AuthenticationService, questi file non sono necessari.

  4. Aggiungere al sito Web un altro file del servizio WCF (SVC) e denominarlo MyRoleSvcWrap.svc.

  5. Aprire il file MyRoleSvcWrap.svc e sostituirne il contenuto con la seguente direttiva @ ServiceHost che crea un riferimento alla classe System.Web.ApplicationServices.RoleService:

    <%@ ServiceHost Language="VB" 
       Service="System.Web.ApplicationServices.RoleService" 
       Factory="System.Web.ApplicationServices.ApplicationServicesHostFactory" %>
    
    <%@ ServiceHost Language="C#" 
      Service="System.Web.ApplicationServices.RoleService" 
      Factory="System.Web.ApplicationServices.ApplicationServicesHostFactory" %>
    
  6. Nella directory App_Code eliminare i file di interfaccia e di classe per il servizio MyRoleSvcWrap.

  7. Aggiungere al sito Web un altro file del servizio WCF (SVC) e denominarlo MyProfileSvcWrap.svc.

  8. Aprire il file MyProfileSvcWrap.svc e sostituirne il contenuto con la seguente direttiva che crea un riferimento alla classe System.Web.ApplicationServices.ProfileService:

    <%@ ServiceHost Language="VB"
      Service="System.Web.ApplicationServices.ProfileService" 
      Factory ="System.Web.ApplicationServices.ApplicationServicesHostFactory" %>
    
    <%@ ServiceHost Language="C#"
    Service="System.Web.ApplicationServices.ProfileService" 
    
    Factory ="System.Web.ApplicationServices.ApplicationServicesHostFactory" %>
    
  9. Nella directory App_Code eliminare i file di interfaccia e di classe per il servizio MyProfileSvcWrap.

  10. Salvare e chiudere tutti i file SVC.

Ora è possibile configurare l'applicazione Web per l'esposizione dei servizi applicativi.

Per configurare i servizi applicativi

  1. Aprire o passare al file Web.config.

  2. Aggiungere una nuova sezione system.web.extensions sotto la sezione configSections.

  3. Nell'elemento scripting, attivare i servizi delle applicazioni mediante la sezione webServices.

    Nell'esempio seguente viene illustrato l'elemento system.web.extensions completo.

    </configSections>
    
    <system.web.extensions>
      <scripting>
        <webServices>
          <authenticationService enabled="true"
           requireSSL = "false"/>
          <profileService
              enabled="true"
              readAccessProperties="FirstName,LastName,EmployeeId"/>
          <roleService enabled="true"/>
        </webServices>
      </scripting>
    </system.web.extensions>
    
      <appSettings/>
    
  4. Aggiungere un elemento serviceHostingEnvironment come elemento figlio della sezione system.serviceModel e quindi impostare la proprietà aspNetCompatibilityEnabled di tale nuovo elemento su true.

    Nell'esempio seguente viene illustrato l'elemento serviceHostingEnvironment completo.

    </runtime>
     <system.serviceModel>
       <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    
  5. Nel gruppo system.serviceModel, configurare i servizi applicativi in modo tale da renderli accessibili alle applicazioni client tramite il protocollo SOAP. A tale scopo, attenersi ai passaggi riportati di seguito:

    1. Nell'elemento system.serviceModel individuare l'elemento <behaviors><serviceBehaviors><behavior> il cui attributo del nome è "MyAuthenSvcWrapBehavior".

    2. Cambiare il valore dell'attributo name dell'elemento behavior da "MyAuthenSvcWrapBehavior" a "AppServiceBehaviors". In questa procedura l'applicazione verrà configurata per utilizzare il comportamento AppServiceBehaviors per tutti e tre i servizi.

    3. Eliminare gli elementi behavior denominati "MyRoleSvcWrapBehavior" o "MyProfileSvcWrapBehavior" dall'elemento <system.serviceModel><behaviors><serviceBehaviors>.

    Nell'esempio seguente viene illustrata la sezione <system.serviceModel> completa.

    </runtime>
     <system.serviceModel>
       <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
      <behaviors>
       <serviceBehaviors>
        <behavior name="AppServiceBehaviors">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
    
  6. Nell'elemento <system.serviceModel><services><service> denominato "MyAuthenSvcWrapBehavior", cambiare il valore dell'attributo behaviorConfiguration dell'elemento behavior da "MyAuthenSvcWrapBehavior" a "AppServiceBehaviors".

  7. Cambiare il valore dell'attributo name da "MyAuthenSvcWrap" a "System.Web.ApplicationServices.AuthenticationService".

  8. Configurare l'elemento <service><endpoint> effettuando le operazioni seguenti:

    1. Eliminare l'attributo address.

    2. Cambiare il valore dell'attributo binding da "wsHttpBinding" a "basicHttpBinding".

    3. Cambiare il valore dell'attributo contract da "IMyAuthenSvcWrap" a "System.Web.ApplicationServices.AuthenticationService".

    4. Aggiungere l'attributo bindingNamespace e impostarlo su "https://asp.net/ApplicationServices/v200".

    5. Eliminare l'elemento identity figlio.

    Nell'esempio seguente viene illustrato il markup relativo all'elemento service di autenticazione.

    <service
      behaviorConfiguration="AppServiceBehaviors" 
      name="System.Web.ApplicationServices.AuthenticationService">
        <endpoint binding="basicHttpBinding" 
      contract="System.Web.ApplicationServices.AuthenticationService"
          bindingNamespace="https://asp.net/ApplicationServices/v200"       
                   >
        </endpoint>
    </service>
    

    Per ulteriori informazioni, vedere la classe Elemento <service>.

  9. Ripetere il passaggio 8 per l'elemento MyAuthenSvcWrap.

    Nell'esempio seguente viene illustrato l'elemento system.serviceModel completo.

    <system.serviceModel>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
      <behaviors>
       <serviceBehaviors>
        <behavior name="AppServiceBehaviors">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
      <services>
        <service 
            behaviorConfiguration="AppServiceBehaviors" 
            name="System.Web.ApplicationServices.AuthenticationService">
          <endpoint  binding="basicHttpBinding" 
              contract="System.Web.ApplicationServices.AuthenticationService"
               bindingNamespace="https://asp.net/ApplicationServices/v200"       
                   />
        </service>
        <service 
            behaviorConfiguration="AppServiceBehaviors" 
            name="System.Web.ApplicationServices.RoleService">
          <endpoint  binding="basicHttpBinding" 
              contract="System.Web.ApplicationServices.RoleService"
              bindingNamespace="https://asp.net/ApplicationServices/v200"       
                   />
        </service>
        <service 
            behaviorConfiguration="AppServiceBehaviors" 
            name="System.Web.ApplicationServices.ProfileService">
          <endpoint  binding="basicHttpBinding"
              contract="System.Web.ApplicationServices.ProfileService"
              bindingNamespace="https://asp.net/ApplicationServices/v200"
                   />
        </service>
      </services>
     </system.serviceModel>
    </configuration>
    

È ora possibile eseguire il sito Web per attivare i servizi di autenticazione che verranno utilizzati dall'applicazione client Windows. Sarà inoltre possibile verificare il corretto funzionamento dell'infrastruttura dei servizi applicativi.

Per attivare il sito Web per l'esposizione dei servizi applicativi

  • In Esplora soluzioni, fare clic con il pulsante destro del mouse sul file MyAuthenSvcWrap.svc e quindi scegliere Visualizza nel browser.

    Il servizio Web viene richiamato e nel browser viene visualizzata una pagina contenente le istruzioni per testare il servizio. Annotare l'URL del servizio, poiché sarà necessario nei passaggi successivi per accedere al servizio dall'applicazione client.

    Nota:

    Non chiudere il browser. Quando si utilizza il server di sviluppo ASP.NET, il browser deve rimanere aperto affinché i servizi applicativi restino attivi.

La procedura di configurazione e messa a disposizione dei servizi applicativi su Web è terminata. Il passaggio successivo consiste nel richiamare questi servizi da un'applicazione client.

Utilizzo dei servizi applicativi

In questa sezione viene illustrato come creare un'applicazione client sotto forma di applicazione console di Windows per accedere ai servizi applicativi. I servizi delle applicazioni possono essere utilizzati da tutte le applicazioni client in grado di inviare e ricevere messaggi nel formato SOAP.

Per creare l'applicazione console client è necessario seguire questa procedura generale:

  • Creare l'applicazione client.

  • Generare i file proxy dei servizi applicativi e un file di configurazione correlato.

  • Aggiungere i file proxy e di configurazione generati all'applicazione client e compilare l'applicazione.

  • Chiamare le operazioni dei servizi applicativi tramite i proxy generati.

    Nota:

    In caso di passaggio di dati utente sensibili al servizio, ad esempio le credenziali di autenticazione, servirsi di Secure Sockets Layer (SSL) utilizzando il protocollo HTTPS. Ad esempio, nel codice seguente, cambiare il valore dell'attributo requireSSL dell'elemento authenticationService da "false" a "true". Per ulteriori informazioni, vedere Transport Security e HTTP Security and ASP.NET Web Services sul sito Web MSDN, oltre a Configuring Secure Sockets Layer in IIS 7.0 sul sito Web IIS (informazioni in lingua inglese).

Per creare un'applicazione console di Windows

  1. In Visual Studio, scegliere Aggiungi dal menu File, quindi Nuovo progetto.

  2. Selezionare il linguaggio desiderato, quindi in Modelli Visual Studio installati selezionare Applicazione console.

  3. Denominare l'applicazione AppSvcClient, immettere un percorso per l'applicazione e fare clic su OK.

    Visual Studio aggiunge il progetto alla soluzione corrente e apre il file di classe predefinito.

  4. Fare clic con il pulsante destro del mouse sul nome dell'applicazione console, quindi scegliere Aggiungi riferimento.

  5. Nella finestra di dialogo Aggiungi riferimento, scegliere la scheda .NET, selezionare System.ServiceModel e System.Runtime.Serialization, quindi scegliere OK.

    In questo modo verranno aggiunti al progetto gli spazi dei nomi contenenti le classi necessarie per utilizzare le classi proxy.

Generazione di classi proxy e informazioni di configurazione per i servizi applicativi

Ora è possibile generare classi proxy e informazioni di configurazione che consentiranno all'applicazione console di accedere ai servizi delle applicazioni dall'applicazione console AppSvcClient. Per ciascun servizio applicativo vengono generate una classe proxy e una configurazione.

Per generare classi proxy per i servizi applicativi

  1. Fare clic sul pulsante Start di Windows, scegliere Tutti i programi, Microsoft Visual Studio 2008, Strumenti du Visual Studio Tools e infine fare clic su Prompt dei comandi di Visual Studio 2008.

    Nota:

    Se si esegue Microsoft Vista, è necessario eseguire questo comando come amministratore.

    Verrà aperta una finestra del prompt dei comandi di Windows le cui impostazioni di ambiente includono un percorso per gli strumenti di .NET Framework.

  2. Nella riga di comando di Windows, passare alla directory contenente il file Program.cs o il file Module1.vb relativo al progetto AppSvcClient.

  3. Generare la classe proxy del servizio di autenticazione utilizzando lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe). Nella riga di comando di Windows aperta al passaggio 1 digitare il comando seguente:

    svcutil https://localhost:8080/WcfApplicationServices/MyAuthenSvcWrap.svc?wsdl /language:"VB"
    
    svcutil https://localhost:8080/WcfApplicationServices/MyAuthenSvcWrap.svc?wsdl /language:"C#"
    
    Nota:

       Il linguaggio di output predefinito è C#. Il flag /language:"VB" è obbligatorio soltanto per Visual Basic.

    Il valore "localhost:8080" deve corrispondere all'URL utilizzato per eseguire il sito Web nella procedura dettagliata. In caso di utilizzo di un numero di porta diverso per il server di sviluppo ASP.NET o di assegnazione di una porta dinamica, sostituire il valore appropriato. Se il numero di porta viene modificato, è necessario aggiornare il file config generato dallo strumento Svcutil.exe per adeguarlo al nuovo numero di porta.

    Il nome del file SVC nel comando deve corrispondere al nome utilizzato per creare il file SVC nelle fasi precedenti di questa procedura dettagliata. Il nome file della classe proxy è arbitrario; in questo esempio corrisponde al nome del file SVC corrispondente.

  4. Cambiare in App.config il nome del file di configurazione output.config generato mediante lo strumento ServiceModel Metadata Utility Tool.

  5. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul nome dell'applicazione console e scegliere Aggiungi e in seguito Elemento esistente. Quindi, selezionare il file generato della classe proxy AuthenticationService e fare clic su Aggiungi.

  6. Nel file di classe principale dell'applicazione console aggiungere il codice seguente per creare un test.

    Imports System.ServiceModel
    
    Module Module1
    
        Sub Main(ByVal args As String())
    
            If (args.Length <> 2) Then
                Console.WriteLine("missing args username password")
                Return
            End If
    
            Dim username As String = args(0)
            Dim password As String = args(1)
            Dim result As Boolean = False
            Dim customCredential As String = "Not Used by the default membership provider"
            Dim isPersistent As Boolean = True ' authentication ticket remains valid across sessions.
    
            'BasicHttpBinding and endpoint are provided in app.config file.
            Dim authService As New AuthenticationServiceClient()
    
            result = authService.Login(username, password, customCredential, isPersistent)
    
            If result Then
                Console.WriteLine("Welcome " + username + ". You have logged in.")
            Else
                Console.WriteLine("We could not validate your credentials.")
            End If
    
            Console.WriteLine("Enter any key to exit.")
            Console.Read()
    
        End Sub
    
    End Module
    
    using System;
    using System.Text;
    using System.ServiceModel;
    
    class Program {
    
        static void Main(string[] args) {
    
            if (args.Length < 1) {
                Console.WriteLine("missing args username password");
                return;
            }
    
            string username = args[0];
            string password = args[1];
            bool result = false;
    
            // BasicHttpBinding and endpoint are provided in app.config file
            AuthenticationServiceClient authService = new AuthenticationServiceClient();
            string customCredential = "Not Used by the default membership provider";
            bool isPersistent = true;  // authentication ticket remains valid across sessions.
    
            result = authService.Login(username, password, customCredential, isPersistent);
    
            if (result == true)
                Console.WriteLine("Welcome " + username + ". You have logged in.");
            else
                Console.WriteLine("Unable to login");
        }
    }
    

    Questo codice consente di passare un nome utente e una password al servizio quando questo viene eseguito dall'applicazione console. È possibile utilizzare i valori di utenti e password creati nelle fasi precedenti della procedura dettagliata.

    L'applicazione di test ottiene dal file App.config le informazioni su associazione ed endpoint.

  7. Testare il progetto effettuando le operazioni seguenti:

    1. In Visual Studio compilare la soluzione.

    2. Nella riga di comando passare alla cartella \bin\debug ed eseguire AppSvcClient.exe. Passare un nome utente e una password nella riga di comando.

    Nell'applicazione console verrà visualizzato un messaggio per indicare che l'accesso è stato eseguito.

  8. Generare la classe proxy del servizio dei profili copiando il comando seguente nella finestra di comando di Windows.

    svcutil.exe https://localhost:8080/WcfApplicationServices/MyProfileSvcWrap.svc?wsdl /language:"VB" /config:app.config /mergeConfig
    
    svcutil.exe https://localhost:8080/WcfApplicationServices/MyProfileSvcWrap.svc?wsdl /language:"C#" /config:app.config /mergeConfig
    

    L'opzione /config:app.config verrà indica che App.config è il file di configurazione, al posto del file predefinito output.config. L'opzione /mergeConfig specifica che le informazioni di configurazione generate in questo passaggio devono essere unite con quelle già presenti nel file App.config creato nei passaggi precedenti.

  9. Generare la classe proxy del servizio di autenticazione copiando il comando seguente nella finestra di comando di Windows.

    svcutil.exe https://localhost:8080/WcfApplicationServices/MyAuthenSvcWrap.svc?wsdl /language:"VB" /config:app.config /mergeConfig
    
    svcutil.exe https://localhost:8080/WcfApplicationServices/MyAuthenSvcWrap.svc?wsdl /language:"C#" /config:app.config /mergeConfig
    
  10. Generare la classe proxy del servizio dei ruoli copiando il comando seguente nella finestra di comando di Windows.

    svcutil.exe https://localhost:8080/WcfApplicationServices/MyRoleSvcWrap.svc?wsdl /language:"VB" /config:app.config /mergeConfig
    
    svcutil.exe https://localhost:8080/WcfApplicationServices/MyRoleSvcWrap.svc?wsdl  /language:"C#" /config:app.config /mergeConfig
    
  11. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul nome dell'applicazione console e scegliere Aggiungi e in seguito Elemento esistente. Quindi, selezionare i file di classe proxy generati e fare clic su Aggiungi.

    Le classi proxy si trovano nella stessa cartella del file App.config e sono denominate AuthenticationService, ProfileService e RoleService.

  12. Sostituire il codice nella classe Program con il codice seguente:

    Imports System
    Imports System.Collections.Generic
    Imports System.Text
    Imports System.ServiceModel
    Imports System.ServiceModel.Activation
    Imports System.ServiceModel.Channels
    Imports System.ComponentModel
    Imports System.Web
    Imports System.Net
    
    Module Module1
    
        Class MyServiceTst
    
            Dim _host As String
    
            Public Property Host() As String
                Get
                    Return _host
                End Get
                Set(ByVal value As String)
                    _host = value
                End Set
            End Property
    
            Function GetCookies(ByVal oc As OperationContext) As CookieContainer
                Dim httpResponseProperty As HttpResponseMessageProperty = DirectCast(oc.IncomingMessageProperties(HttpResponseMessageProperty.Name), HttpResponseMessageProperty)
                If (httpResponseProperty.Equals(Nothing) = False) Then
                    Dim cookieContainer As New CookieContainer()
                    Dim header As String = httpResponseProperty.Headers(HttpResponseHeader.SetCookie)
    
                    If header <> Nothing Then
                        cookieContainer.SetCookies(New Uri("http://someuri.tld"), header)
                    End If
                    Return cookieContainer
                End If
                Return Nothing
            End Function
    
            Sub SetCookies(ByVal oc As OperationContext, ByVal cookieContainer As CookieContainer)
                Dim httpRequestProperty = New HttpRequestMessageProperty()
                httpRequestProperty = Nothing
                If oc.OutgoingMessageProperties.ContainsKey(HttpRequestMessageProperty.Name) Then
                    httpRequestProperty = TryCast(oc.OutgoingMessageProperties(HttpRequestMessageProperty.Name), HttpRequestMessageProperty)
                End If
                If httpRequestProperty Is Nothing Then
                    httpRequestProperty = New HttpRequestMessageProperty()
                    oc.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequestProperty)
                End If
                httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, cookieContainer.GetCookieHeader(New Uri("http://someuri.tld")))
            End Sub
    
            Sub GetUserRoles(ByVal cookieContainer As CookieContainer)
                Dim roleSvc As New RoleServiceClient()
    
                Using New OperationContextScope(DirectCast(roleSvc.InnerChannel, IContextChannel))
                    SetCookies(OperationContext.Current, cookieContainer)
                    Dim roles As String() = roleSvc.GetRolesForCurrentUser()
                    If roles.Length = 0 Then
                        Console.WriteLine("User does not belong to any role.")
                    Else
                        Dim userRoles As String = ""
                        Dim i As Integer = 0
                        While i < roles.Length
                            userRoles += roles(i) + " "
                            Global.System.Math.Max(Global.System.Threading.Interlocked.Increment(i), i - 1)
                        End While
                        Console.WriteLine("User's roles: " + userRoles)
    
                    End If
                End Using
            End Sub
    
            Sub GetProfileInfo(ByVal cookieContainer As CookieContainer)
                Dim profileSvc As New ProfileServiceClient()
    
                Using New OperationContextScope(DirectCast(profileSvc.InnerChannel, IContextChannel))
                    SetCookies(OperationContext.Current, cookieContainer)
                    Dim profileData As Dictionary(Of String, Object) = profileSvc.GetPropertiesForCurrentUser(New String() {"FirstName", "LastName", "EmployeeId"}, True)
    
                    Console.WriteLine("FirstName: " + profileData("FirstName"))
                    Console.WriteLine("LastName: " + profileData("LastName"))
                    Console.WriteLine("EmployeeId: " + profileData("EmployeeId"))
                End Using
            End Sub
    
            Public Function strEndPtAddr(ByVal service As String) As String
                Dim endPtAddr As String = "http://" + Host + "/WcfApplicationServices/" + service + ".svc?wsdl"
    
                Return endPtAddr
            End Function
    
            Sub Init(ByVal args As String())
    
                If (args.Length = 3) Then  'The host address was passed in , use that.
                    Host = args(2)
                Else
                    Host = "localhost:8080"  
                End If
    
                Dim username As String = args(0)
                Dim password As String = args(1)
                Dim result As Boolean
                Dim binding As BasicHttpBinding = New BasicHttpBinding()
                Dim endPtAddr As String = strEndPtAddr("MyAuthenSvcWrap")
    
                Console.WriteLine("Attempting to connect as username = " + username + vbNewLine _
                  + "password length = " + password.Length.ToString() + vbNewLine _
                  + " on server " + Host + vbNewLine _
                  + "End point address: " + endPtAddr _
                  )
                ' BasicHttpBinding and endpoint are explicitly passed and ignored
                ' in app.config file.
    
                Dim authService As AuthenticationServiceClient = New AuthenticationServiceClient(binding, _
                                                      New EndpointAddress(endPtAddr))
    
                Dim cookieContainer As CookieContainer = Nothing
                Dim customCredential As String = "Not Used by the default membership provider"
                Dim isPersistent As Boolean = True   ' authentication ticket remains valid across sessions.
    
                Using New OperationContextScope(authService.InnerChannel)
                    Try
                        result = authService.Login(username, password, customCredential, isPersistent)
                        cookieContainer = GetCookies(OperationContext.Current)
                    Catch enf As EndpointNotFoundException
                        Console.WriteLine(enf.Message)
                        Return
                    End Try
    
    
                End Using
    
                If result Then
                    Console.WriteLine("Welcome " + username + ". You have logged in.")
    
                    GetProfileInfo(cookieContainer)
                    GetUserRoles(cookieContainer)
                Else
                    Console.WriteLine("We could not validate your credentials.")
                End If
    
    
            End Sub
        End Class
    
    
    
        Sub Main(ByVal args As String())
    
            If (args.Length < 1) Then
                Console.WriteLine("missing args username password")
                Return
            End If
    
            Dim mst As MyServiceTst = New MyServiceTst()
            mst.Init(args)
    
    
            Console.WriteLine("Enter any key to exit.")
            Console.Read()
    
        End Sub
    
    End Module
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.ServiceModel;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Channels;
    using System.ComponentModel;
    using System.Web;
    using System.Net;
    
    
    class MyServiceTst {
    
        string Host { get; set; }      
    
        CookieContainer GetCookies(OperationContext oc) {
            HttpResponseMessageProperty httpResponseProperty =
                (HttpResponseMessageProperty)oc.IncomingMessageProperties[HttpResponseMessageProperty.Name];
            if (httpResponseProperty != null) {
                CookieContainer cookieContainer = new CookieContainer();
                string header = httpResponseProperty.Headers[HttpResponseHeader.SetCookie];
    
                if (header != null) {
                    cookieContainer.SetCookies(new Uri(@"http://someuri.tld"), header);
                }
                return cookieContainer;
            }
            return null;
        }
    
        void SetCookies(OperationContext oc, CookieContainer cookieContainer) {
    
            HttpRequestMessageProperty httpRequestProperty = null;
            if (oc.OutgoingMessageProperties.ContainsKey(HttpRequestMessageProperty.Name)) {
                httpRequestProperty =
                    oc.OutgoingMessageProperties[HttpRequestMessageProperty.Name]
                    as HttpRequestMessageProperty;
            }
    
            if (httpRequestProperty == null) {
                httpRequestProperty = new HttpRequestMessageProperty();
                oc.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name,
                    httpRequestProperty);
            }
            httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie,
                cookieContainer.GetCookieHeader(new Uri(@"http://someuri.tld")));
        }
    
    
        void GetUserRoles(CookieContainer cookieContainer) {
    
            string endPtAddr = strEndPtAddr("MyRoleSvcWrap");
    
            RoleServiceClient roleSvc = new RoleServiceClient(new BasicHttpBinding(),
                 new EndpointAddress(endPtAddr));
    
            using (new OperationContextScope((IContextChannel)roleSvc.InnerChannel)) {
                SetCookies(OperationContext.Current, cookieContainer);
                string[] roles = roleSvc.GetRolesForCurrentUser();
                if (roles.Length == 0) {
                    Console.WriteLine("User does not belong to any role.");
                } else {
                    string userRoles = "";
                    for (int i = 0; i < roles.Length; i++) {
                        userRoles += roles[i] + " ";
                    }
                    Console.WriteLine("User's roles: " + userRoles);
                }
    
            }
        }
    
        void GetProfileInfo(CookieContainer cookieContainer) {
    
            string endPtAddr = strEndPtAddr("MyProfileSvcWrap");
    
            ProfileServiceClient profileSvc = new ProfileServiceClient(new BasicHttpBinding(),
                 new EndpointAddress(endPtAddr));
    
            string[] strProfileProps = new string[] { "FirstName", "LastName", "EmployeeId" };
    
            using (new OperationContextScope((IContextChannel)profileSvc.InnerChannel)) {
                SetCookies(OperationContext.Current, cookieContainer);
                Dictionary<string, object> profileData =
                    profileSvc.GetPropertiesForCurrentUser(strProfileProps, true);
    
                foreach (string sProp in strProfileProps)
                    Console.WriteLine(sProp + ": " + profileData[sProp]);
    
            }
        }
    
        public string strEndPtAddr(string service) {
    
            string endPtAddr = @"http://" + Host + "/WcfApplicationServices/"
                + service + ".svc?wsdl";
    
            return endPtAddr;
        }
    
        public void Init(string[] args) {
    
            if (args.Length == 3)   // The host address was passed in , use that
                Host = args[2];
            else
                Host = "localhost:8080";  
    
            string username = args[0];
            string password = args[1];
            bool result = false;
            BasicHttpBinding binding = new BasicHttpBinding();
            string endPtAddr = strEndPtAddr("MyAuthenSvcWrap");
    
            Console.WriteLine("Attempting to connect as username = " + username
                + "\n password length = " + password.Length.ToString()
                + "\n on server " + Host + "\n"
                + "\n" + endPtAddr
            );
    
            // BasicHttpBinding and endpoint are explicitly passed and ignored
            // in app.config file
    
            AuthenticationServiceClient authService = new AuthenticationServiceClient(binding,
                                                         new EndpointAddress(endPtAddr));
    
            CookieContainer cookieContainer;
            string customCredential = "Not Used by the default membership provider";
            bool isPersistent = true;  // authentication ticket remains valid across sessions.
    
            using (new OperationContextScope(authService.InnerChannel)) {
                try {
                    result = authService.Login(username, password,
                                                 customCredential, isPersistent);
                    cookieContainer = GetCookies(OperationContext.Current);
                } catch (EndpointNotFoundException enfe) {
                    Console.WriteLine(enfe.Message);
                    if (enfe.InnerException != null && enfe.InnerException.Message != null)
                        Console.WriteLine(enfe.InnerException.Message);
                    return;
                }
            }
    
            if (result) {
                Console.WriteLine("Welcome " + username + ". You have logged in.");
    
                GetUserRoles(cookieContainer);
                GetProfileInfo(cookieContainer);
            } else {
                Console.WriteLine("We could not validate your credentials.");
            }
    
        }
    }
    
    class Program {
    
        static void Main(string[] args) {
    
            if (args.Length < 1) {
                Console.WriteLine("missing args username password [host]");
                return;
            }
            MyServiceTst mst = new MyServiceTst();
            mst.Init(args);
    
            Console.WriteLine("Enter any key to exit.");
            // Console.Read();
        }
    
    }
    
    
  13. Compilare il progetto.

Accesso ai servizi applicativi

Ora è possibile eseguire l'applicazione client e utilizzare i servizi applicativi esposti come parte del sito Web.

Per eseguire l'applicazione Windows

  1. Nel prompt dei comandi di Windows, passare alla directory dell'applicazione console.

  2. Immettere il comando seguente con il nome utente e la password di uno degli utenti creati precedentemente nella procedura dettagliata.

    AppSvcClient.exe <userName> <password>

    Se si immettono le credenziali corrette verrà eseguita l'autenticazione e sarà possibile ottenere i ruoli e le informazioni sul profilo associati all'utente connesso.

Passaggi successivi

In questa procedura dettagliata sono stati illustrati i principi di base dell'accesso ai servizi delle applicazioni ASP.NET da un'applicazione client in grado di inviare e ricevere messaggi nel formato SOAP.

È anche possibile sperimentare ulteriori funzionalità dei servizi applicativi. Di seguito sono riportati alcuni suggerimenti per ulteriori esplorazioni:

  • Acquisire maggiori informazioni sull'utilizzo dei servizi applicativi da client .NET Framework. Per ulteriori informazioni, vedere Cenni preliminari sui servizi delle applicazioni client.

  • Acquisire maggiori informazioni su Windows Communication Foundation (WCF) e sullo scambio di dati con il client in formato SOAP. Per ulteriori informazioni, vedere XML Web Services Infrastructure sul sito Web MSDN (informazioni in lingua inglese).

Per informazioni generali sui servizi Web, è possibile eseguire quanto segue:

  • Analizzare l'elaborazione che avviene durante la chiamata a un servizio Web. Per ulteriori informazioni, vedere Anatomia del ciclo di vita di un servizio Web XML.

  • Analizzare l'utilizzo dei servizi Web. Per ulteriori informazioni, vedere Scenari dei servizi Web XML.

  • Ulteriori informazioni sui servizi applicativi ASP.NET. Per ulteriori informazioni, vedere AuthenticationServiceLogin().

Vedere anche

Attività

Procedura: attivare il servizio di autenticazione WCF

Procedura: attivare il servizio ruolo WCF

Procedura: attivare il servizio profili WCF

Concetti

Definizione delle proprietà dei profili ASP.NET

Cenni preliminari sui servizi delle applicazioni ASP.NET