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
Aprire Visual Studio 2008.
Scegliere Nuovo sito Web dal menu File.
Verrà visualizzata la finestra di dialogo Nuovo sito Web.
In Modelli Visual Studio installati fare clic su Sito Web ASP.NET.
Selezionare File system nell'elenco Percorso.
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.
Scegliere OK.
Visual Studio crea un nuovo sito Web ASP.NET e apre la pagina Default.aspx.
In Esplora soluzioni fare clic sul nome del sito Web, quindi premere F4 per aprire la finestra Proprietà.
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à.
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
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.
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>
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"; } } }
Aggiungere una pagina denominata Login.aspx. Assicurarsi che Inserisci codice in file separato sia selezionato.
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>
Aggiungere una pagina denominata Profile.aspx e verificare che l'opzione Inserisci codice in file separato sia selezionata.
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.
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.
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>
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
Aprire il file Web.config del sito Web.
Nel gruppo system.web, cambiare l'autenticazione predefinita di Windows nell'autenticazione basata su form come illustrato nell'esempio seguente:
<authentication mode="Forms" />
Nel gruppo system.web, configurare il servizio ruoli aggiungendo l'elemento roleManager, come illustrato nell'esempio seguente:
<roleManager enabled="true"/>
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
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
Scegliere Nuovo utente.
Verrà visualizzata la pagina CreateUser.aspx.
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.
Nella pagina Default.aspx, fare clic su Accesso.
Verrà visualizzata la pagina Login.aspx.
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.
Fare clic su Informazioni profilo.
Verrà visualizzata la pagina Profile.aspx.
Immettere o aggiornare le informazioni sul profilo dell'utente connesso immettendo nome, cognome e numero di identificazione.
Fare clic su Aggiorna dati profilo.
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
Aggiungere un file del servizio WCF (SVC) al sito Web e denominarlo MyAuthenSvcWrap.svc.
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.
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.
Aggiungere al sito Web un altro file del servizio WCF (SVC) e denominarlo MyRoleSvcWrap.svc.
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" %>
Nella directory App_Code eliminare i file di interfaccia e di classe per il servizio MyRoleSvcWrap.
Aggiungere al sito Web un altro file del servizio WCF (SVC) e denominarlo MyProfileSvcWrap.svc.
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" %>
Nella directory App_Code eliminare i file di interfaccia e di classe per il servizio MyProfileSvcWrap.
Salvare e chiudere tutti i file SVC.
Ora è possibile configurare l'applicazione Web per l'esposizione dei servizi applicativi.
Per configurare i servizi applicativi
Aprire o passare al file Web.config.
Aggiungere una nuova sezione system.web.extensions sotto la sezione configSections.
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/>
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"/>
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:
Nell'elemento system.serviceModel individuare l'elemento <behaviors><serviceBehaviors><behavior> il cui attributo del nome è "MyAuthenSvcWrapBehavior".
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.
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>
Nell'elemento <system.serviceModel><services><service> denominato "MyAuthenSvcWrapBehavior", cambiare il valore dell'attributo behaviorConfiguration dell'elemento behavior da "MyAuthenSvcWrapBehavior" a "AppServiceBehaviors".
Cambiare il valore dell'attributo name da "MyAuthenSvcWrap" a "System.Web.ApplicationServices.AuthenticationService".
Configurare l'elemento <service><endpoint> effettuando le operazioni seguenti:
Eliminare l'attributo address.
Cambiare il valore dell'attributo binding da "wsHttpBinding" a "basicHttpBinding".
Cambiare il valore dell'attributo contract da "IMyAuthenSvcWrap" a "System.Web.ApplicationServices.AuthenticationService".
Aggiungere l'attributo bindingNamespace e impostarlo su "https://asp.net/ApplicationServices/v200".
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>.
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
In Visual Studio, scegliere Aggiungi dal menu File, quindi Nuovo progetto.
Selezionare il linguaggio desiderato, quindi in Modelli Visual Studio installati selezionare Applicazione console.
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.
Fare clic con il pulsante destro del mouse sul nome dell'applicazione console, quindi scegliere Aggiungi riferimento.
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
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.
Nella riga di comando di Windows, passare alla directory contenente il file Program.cs o il file Module1.vb relativo al progetto AppSvcClient.
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.
Cambiare in App.config il nome del file di configurazione output.config generato mediante lo strumento ServiceModel Metadata Utility Tool.
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.
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.
Testare il progetto effettuando le operazioni seguenti:
In Visual Studio compilare la soluzione.
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.
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.
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
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
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.
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(); } }
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
Nel prompt dei comandi di Windows, passare alla directory dell'applicazione console.
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