Partager via


Procédure pas à pas : utilisation de services d'application ASP.NET

Mise à jour : novembre 2007

ASP.NET fournit des services d'application sur le Web qui permettent aux applications clientes d'accéder aux informations d'authentification utilisateur, de rôle et de profil. Ces informations sont accessibles aux applications clientes écrites dans des langages différents et exécutés sur des systèmes d'exploitation différents. La seule exigence est que ces clients doivent être en mesure de communiquer par le biais du protocole SOAP 1.1.

Cette procédure pas à pas est divisée comme suit :

  • La partie 1 indique comment configurer un site Web ASP.NET pour exposer les services d'application.

  • La partie 2 indique comment générer une application console Windows qui accède aux informations d'authentification de l'utilisateur, de rôles et de profil. Dans cette procédure pas à pas, vous générerez une application console Windows, mais les services d'application ASP.NET sont disponibles pour les applications clientes qui peuvent envoyer et recevoir des messages au format SOAP.

Composants requis

Pour exécuter cette procédure pas à pas, vous devez utiliser :

  • Visual Studio 2008. Vous ne pouvez pas utiliser Microsoft Visual Web Developer 2005 pour cette procédure pas à pas, parce que vous allez créer une application console Windows, non prise en charge dans Visual Web Developer Express.

  • Microsoft SQL Server ou Microsoft SQL Server Express Edition installé sur votre ordinateur.

Exposition des services d'application

Cette section explique comment exposer les services d'application dans le cadre d'un site Web ASP.NET afin qu'ils puissent être accessibles à tout client sur le réseau. Les étapes décrites ici s'appliquent uniquement au serveur.

Remarque :

Vous devez utiliser un site Web de système de fichiers pour cette procédure pas à pas. La procédure pas à pas suppose que vous utilisez le serveur de développement ASP.NET plutôt qu'IIS pour exécuter les exemples. Pour plus d'informations, consultez Serveurs Web dans Visual Web Developer.

Pour créer le site Web des services de l'application

  1. Ouvrez Visual Studio 2008.

  2. Dans le menu Fichier, cliquez sur Nouveau site Web.

    La boîte de dialogue Nouveau site Web s'affiche.

  3. Sous Modèles Visual Studio installés, sélectionnez Site Web ASP.NET.

  4. Dans la liste Emplacement, sélectionnez Système de fichiers.

  5. Dans la zone de texte Dossier, affectez le nom WcfApplicationServices au site Web.

    Remarque :

    Vous pouvez utiliser n'importe quel nom. Si vous utilisez un nom différent, notez-le pour être en mesure de le remplacer lorsqu'il sera requis à une étape ultérieure de cette procédure pas à pas.

  6. Cliquez sur OK.

    Visual Studio crée le nouveau site Web ASP.NET et ouvre la page Default.aspx.

  7. Dans l'Explorateur de solutions, cliquez sur le nom du site Web, puis appuyez sur F4 pour ouvrir la fenêtre Propriétés.

  8. Dans la fenêtre Propriétés, affectez la valeur False à Utiliser des ports dynamiques.

    Ceci indique à Visual Studio de spécifier un port fixe au lieu d'un port sélectionné aléatoirement lorsqu'il démarre le serveur de développement ASP.NET. Pour cette procédure pas à pas, vous devez avoir un numéro de port fixe que vous pouvez utiliser lorsque vous générez les classes et fichiers de configuration du proxy client. Pour plus d'informations, consultez Comment : spécifier un port pour le serveur de développement ASP.NET.

    Remarque :

    Vous ne pouvez pas accéder à la fenêtre Propriétés du site Web à partir de la fenêtre Pages de propriétés.

  9. Affectez à Numéro de port la valeur 8080.

    Remarque :

    Vous pouvez utiliser tout port disponible. Si vous utilisez un port différent, notez le numéro de port afin que vous puissiez substituer ce nombre à 8080 à une étape ultérieure de cette procédure.

Les informations d'appartenance d'ASP.NET, de rôle et de profil sont stockées dans une base de données. Cette base de données est créée automatiquement au moment utile. Dans la procédure suivante, vous allez créer des utilisateurs et des rôles pour votre application, ce qui créera automatiquement la base de données.

Pour créer des informations d'utilisateurs et de rôles

  1. Ajoutez un fichier Global.asax au site Web, et dans le fichier, remplacez la méthode Application_Start existante par le code suivant :

    <%@ 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>
    
    

    Lors de la première exécution de l'application Web, le code crée la base de données locale Aspnetdb.mdf et lui ajoute les rôles Administrateurs et Friend. Cette base de données est utilisée pour stocker les informations d'identification de l'utilisateur, les rôles et les informations de profil.

  2. Ouvrez la page Default.aspx et ajoutez-lui le balisage suivant. Des liens sont ajoutés pour la page de connexion, la page des informations de profil et la page du nouvel utilisateur. Vous ajouterez ces pages ultérieurement dans la procédure pas à pas.

    <%@ 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. Dans le fichier code-behind Default.aspx, ajoutez le code dans la méthode Page_Load qui vérifie si l'utilisateur est authentifié.

    L'exemple suivant indique comment vérifier qu'un utilisateur est authentifié.

    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. Ajoutez une page nommée Login.aspx. Assurez-vous que la case à cocher Placer le code dans un fichier distinct est activée.

  5. Ajoutez un contrôle Login dans le fichier Login.aspx.

    L'exemple suivant montre le balisage du fichier 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. Ajoutez une page nommée Profile.aspx, puis assurez-vous que Placer le code dans un fichier distinct est sélectionné.

  7. Ajoutez le balisage suivant à la page 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 page Profil contient des contrôles Label qui permettent d'afficher le nom d'utilisateur et le rôle, ainsi que des contrôles TextBox qui permettent de modifier le nom et l'ID de l'utilisateur.

  8. Dans le fichier code-behind de la page Profile.aspx, ajoutez le code suivant :

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

    Dans l'exemple précédent, le nom de classe dans le fichier code-behind a été remplacé par _Profile pour éviter tout conflit avec l'instance de Profile.

    Le code de cette page vous permet d'obtenir et de modifier des informations de profil utilisateur.

    Remarque :

    La compilation du projet ne s'opère pas tant que vous n'activez pas les propriétés de profil du site Web. Vous effectuerez cette opération dans la procédure suivante.

  9. Ajoutez une page nommée CreateUser.aspx et ajoutez-lui la balise suivante :

    <%@ 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. Dans le fichier code-behind de la page CreateUser.aspx, ajoutez le code suivant :

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

    Cette page vous permet de créer des utilisateurs et de leur assigner un rôle.

L'étape suivante consiste à activer les propriétés d'authentification par formulaire, de rôle et de profil dans le site Web. Pour ce faire, vous utilisez les paramètres de configuration du fichier Web.config.

Pour configurer les propriétés d'authentification, de rôle et de profil

  1. Ouvrez le fichier Web.config du site Web.

  2. Dans le groupe system.web, remplacez l'authentification Windows par défaut par l'authentification par formulaire, comme indiqué dans l'exemple suivant :

    <authentication mode="Forms" />
    
  3. Dans le groupe system.web, configurez le service de rôles en ajoutant l'élément roleManager, comme indiqué dans l'exemple suivant :

    <roleManager enabled="true"/>
    
  4. Dans le groupe system.web, configurez le service de profil à l'aide de la section profile et de son élément properties, comme indiqué dans l'exemple suivant :

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

    Ce paramètre de profil définit trois propriétés qui seront gérées par le service de profil ASP.NET. Au moment de l'exécution, ASP.NET crée dynamiquement une classe de type ProfileCommon qui contient ces propriétés.

    L'exemple suivant montre une partie du fichier Web.config avec toutes les modifications requises.

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

Vous pouvez maintenant créer des informations utilisateur que vous utiliserez ultérieurement pour vous connecter.

Pour créer des utilisateurs et assigner des informations de profil

  1. Dans l'Explorateur de solutions, sélectionnez la page Default.aspx, puis appuyez sur CTRL+F5 pour exécuter la page.

    La page s'affiche dans le navigateur avec l'URL suivante :

    https://localhost:8080/WcfApplicationServices/Default.aspx
    
  2. Cliquez sur Nouvel utilisateur.

    La page CreateUser.aspx s'affiche.

  3. Créez des utilisateurs et assignez-les aux rôles prédéfinis. Pour ce faire, entrez les informations d'identification de l'utilisateur, puis cliquez sur Créer un utilisateur.

    Enregistrez les noms d'utilisateur et mots de passe que vous avez créés. Vous en aurez besoin pour assigner ou modifier les informations de profil des utilisateurs.

    Par exemple, créez un utilisateur doté du nom d'utilisateur « joeA » et activez la case à cocher Administrateur afin que joeA soit membre du rôle Administrateurs. Créez un second utilisateur doté du nom d'utilisateur « joeNA » et n'activez pas la case à cocher Administrateur. L'utilisateur joeNA sera membre du rôle Friends mais ne sera pas membre du rôle Administrateurs. Les rôles Friends et Administrateurs sont créés par le code que vous avez ajouté précédemment à la méthode Application_Start dans le fichier Global.asax.

    Une fois qu'un utilisateur a été créé, vous êtes redirigé vers la page Default.aspx.

  4. Dans la page Default.aspx, cliquez sur Connexion.

    La page Login.aspx s'affiche.

  5. Connectez-vous à l'aide des informations d'identification de l'un des utilisateurs créés précédemment.

    Si la connexion réussit, vous êtes redirigé vers la page Default.aspx.

  6. Cliquez sur Informations sur le profil.

    La page Profile.aspx s'affiche.

  7. Entrez ou mettez à jour les informations de profil de l'utilisateur connecté en entrant le prénom, le nom et le numéro d'identification.

  8. Cliquez sur Mettre à jour les informations de profil.

  9. Cliquez sur Lire les informations de profil.

    Les informations que vous venez d'entrer s'affichent. Cette étape vous permet de vérifier que les propriétés de profil fonctionnent.

Vous avez terminé de créer des utilisateurs et des informations de profil. Il convient maintenant de rendre ces informations accessibles aux applications clientes.

Mappage et configuration des services d'application

Vous pouvez à présent exposer les informations utilisateur que vous avez créées à l'aide des services d'application ASP.NET. Avant de pouvoir accéder aux information d'authentification de l'utilisateur et de profil à partir du client, vous devez créer des fichiers de mappage (.svc) qui pointent sur les services d'application. Ainsi, les services deviennent disponibles pour toute application exécutée sur une plateforme qui peut envoyer et recevoir des messages SOAP. Vous devez également configurer le site Web de sorte que les services d'application soient exposés sur le réseau.

Pour créer des fichiers de mappage des services d'application

  1. Ajoutez un fichier de service WCF (.svc) au site Web et nommez-le MyAuthenSvcWrap.svc.

  2. Remplacez la directive @ ServiceHost existante par la directive suivante, qui fait référence à la 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" %>
    

    Cet exemple de service n'implémente pas de service d'authentification personnalisé. À la place, il appelle la classe System.Web.ApplicationServices.AuthenticationService intégrée.

  3. Supprimez les fichiers d'interface et de classe dans le répertoire App_Code (App_Code\MyAuthenSvcWrap et App_Code\IMyAuthenSvcWrap).

    Les fichiers d'interface et de classe ont été créés lors de l'ajout du fichier .svc au projet. Vous n'avez pas besoin de ces fichiers, car vous utilisez le service System.Web.ApplicationServices.AuthenticationService et n'implémentez pas de service personnalisé.

  4. Ajoutez un autre fichier de service WCF (.svc) au site Web et nommez-le MyRoleSvcWrap.svc.

  5. Ouvrez le fichier MyRoleSvcWrap.svc et remplacez son contenu par la directive @ ServiceHost, qui crée une référence à la 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. Dans le répertoire App_Code, supprimez les fichiers d'interface et de classe pour le service MyRoleSvcWrap.

  7. Ajoutez un autre fichier de service WCF (.svc) au site Web et nommez-le MyProfileSvcWrap.svc.

  8. Ouvrez le fichier MyProfileSvcWrap.svc et remplacez son contenu par la directive suivante, pour créer une référence à la 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. Dans le répertoire App_Code, supprimez les fichiers d'interface et de classe pour le service MyProfileSvcWrap.

  10. Enregistrez et fermez tous les fichiers .svc.

Vous pouvez maintenant configurer l'application Web afin d'exposer les services d'application.

Pour configurer les services d'application

  1. Ouvrez le fichier Web.config ou basculez vers ce dernier.

  2. Sous la section configSections, ajoutez une nouvelle section system.web.extensions.

  3. Dans l'élément scripting, activez les services d'application par le biais de la section webServices.

    L'exemple suivant présente l'élément system.web.extensions finalisé.

    </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. En tant qu'enfant de la section system.serviceModel, ajoutez un élément serviceHostingEnvironment et affectez à son paramètre aspNetCompatibilityEnabled la valeur true.

    L'exemple suivant présente l'élément serviceHostingEnvironment finalisé.

    </runtime>
     <system.serviceModel>
       <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    
  5. Dans le groupe system.serviceModel, configurez les services d'application de sorte que les applications clientes puissent y accéder à l'aide du protocole SOAP. Pour ce faire, procédez comme suit :

    1. Dans l'élément system.serviceModel, identifiez l'élément <behaviors><serviceBehaviors><behavior> dont l'attribut name est "MyAuthenSvcWrapBehavior".

    2. Modifiez la valeur de l'attribut name de l'élément behavior en remplaçant "MyAuthenSvcWrapBehavior" par "AppServiceBehaviors". Dans cette procédure pas à pas, vous configurez l'application de sorte que le comportement AppServiceBehaviors soit utilisé pour les trois services.

    3. Supprimez de l'élément <system.serviceModel><behaviors><serviceBehaviors> les éléments behavior nommés "MyRoleSvcWrapBehavior" et "MyProfileSvcWrapBehavior".

    L'exemple suivant présente la section <system.serviceModel> finalisée.

    </runtime>
     <system.serviceModel>
       <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
      <behaviors>
       <serviceBehaviors>
        <behavior name="AppServiceBehaviors">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
    
  6. Dans l'élément <system.serviceModel><services><service> nommé "MyAuthenSvcWrapBehavior", modifiez la valeur de l'attribut behaviorConfiguration de l'élément behavior en remplaçant "MyAuthenSvcWrapBehavior" par "AppServiceBehaviors".

  7. Modifiez la valeur de l'attribut name en remplaçant "MyAuthenSvcWrap" par "System.Web.ApplicationServices.AuthenticationService".

  8. Configurez l'élément <service><endpoint> en procédant comme suit :

    1. Supprimez l'attribut address.

    2. Modifiez la valeur de l'attribut binding en remplaçant "wsHttpBinding" par "basicHttpBinding".

    3. Modifiez la valeur de l'attribut contract en remplaçant "IMyAuthenSvcWrap" par "System.Web.ApplicationServices.AuthenticationService".

    4. Ajoutez l'attribut bindingNamespace et affectez-lui la valeur "https://asp.net/ApplicationServices/v200".

    5. Supprimez l'élément identity enfant.

    L'exemple suivant illustre le balisage de l'élément d'authentification service.

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

    Pour plus d'informations, consultez Élément <service>.

  9. Répétez l'étape 8 pour l'élément MyAuthenSvcWrap.

    L'exemple suivant présente l'élément system.serviceModel complet.

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

Vous pouvez à présent exécuter le site Web afin d'activer les services d'authentification qui seront utilisés par l'application cliente Windows. Cela vous permet également de vérifier que l'infrastructure du service de l'application fonctionne correctement.

Pour activer le site Web afin d'exposer les services d'application

  • Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le fichier MyAuthenSvcWrap.svc, puis cliquez sur Aperçu dans le navigateur.

    Le service Web est appelé et la page qui s'affiche dans le navigateur vous fournit des instructions concernant le test du service. Notez l'URL du service car vous en aurez besoin dans les étapes suivantes pour accéder au service à partir de l'application cliente.

    Remarque :

    Ne fermez pas la fenêtre du navigateur. Lorsque vous utilisez le serveur de développement ASP.NET, le navigateur doit rester ouvert pour que les services d'application restent actifs.

Vous avez terminé de configurer les services d'application sur le Web afin qu'ils soient disponibles sur le Web. L'étape suivante consiste à appeler ces services à partir d'une application cliente.

Utilisation des services d'application

Cette section indique comment créer une application cliente dans le formulaire d'une application console Windows pour accéder aux services d'application. Les services d'application sont accessibles à tout client qui peut envoyer et recevoir des messages au format SOAP.

Pour créer l'application console cliente, suivez ces étapes générales :

  • Créez l'application cliente.

  • Générez des fichiers de proxy des services de l'application et un fichier de configuration associé.

  • Ajoutez le proxy généré et les fichiers de configuration à l'application cliente et compilez l'application.

  • Appelez les opérations du service de l'application par le biais des proxys générés.

    Remarque :

    Si vous transmettez au service des données utilisateur sensibles, telles que des informations d'authentification, utilisez le protocole HTTPS avec le chiffrement SSL (Secure Sockets Layer). Par exemple, dans l'exemple ci-dessous, vous modifiez la valeur de l'attribut requireSSL de l'élément authenticationService en remplaçant "false" par "true". Pour plus d'informations, consultez Sécurité de transport et Sécurité HTTP et services Web ASP.NET (en anglais) sur le site Web MSDN, et Configuration de SSL (Secure Sockets Layer) dans IIS 7.0 (en anglais) sur le site Web IIS.

Pour créer une application console Windows

  1. Dans Visual Studio, dans le menu Fichier, cliquez sur Ajouter puis sur Nouveau projet.

  2. Sélectionnez votre langue par défaut, puis sous Modèles Visual Studio installés, sélectionnez Application console.

  3. Nommez l'application AppSvcClient, entrez un emplacement pour l'application, puis cliquez sur OK.

    Visual Studio ajoute le projet à la solution actuelle et ouvre le fichier de classe par défaut.

  4. Cliquez avec le bouton droit sur le nom de l'application console et cliquez sur Ajouter une référence.

  5. Dans la boîte de dialogue Ajouter une référence, cliquez sur l'onglet .NET, sélectionnez System.ServiceModel et System.Runtime.Serialization, puis cliquez sur OK.

    Ceci ajoute les espaces de noms au projet qui inclut les classes requises pour utiliser les classes proxy.

Génération des classes proxy et des informations de configuration pour les services d'application

Vous pouvez maintenant générer les classes proxy et les informations de configuration qui permettront à l'application console d'accéder aux services d'application à partir de l'application console AppSvcClient. Vous générez séparément une classe proxy et une configuration pour chaque service d'application.

Pour générer des classes proxy pour les services d'application

  1. Dans le menu Démarrer de Windows, cliquez sur Tous les programmes, sur Microsoft Visual Studio 2008, sur Visual Studio Tools, puis sur Invite de commandes de Visual Studio 2008.

    Remarque :

    Si vous êtes équipé d'un système d'exploitation Microsoft Vista, exécutez cette commande en tant qu'administrateur.

    Dans la fenêtre d'invite de commandes Windows qui s'affiche, les paramètres d'environnement incluent un chemin d'accès aux outils du .NET Framework.

  2. Dans la ligne de commande Windows, activez le répertoire qui contient le fichier Program.cs ou Module1.vb pour le projet AppSvcClient.

  3. Générez la classe proxy du service d'authentification en utilisant l'utilitaire de service (Svcutil.exe). Dans la ligne de commande Windows que vous avez ouverte à l'étape 1, entrez la commande suivante :

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

       Le langage de sortie par défaut est C#. L'indicateur /language:"VB" est requis uniquement pour Visual Basic.

    La valeur "localhost:8080" doit correspondre à l'URL que vous utilisez lorsque vous exécutez le site Web à partir de cette procédure pas à pas. Si vous avez utilisé un numéro de port différent pour le serveur de développement ASP.NET, ou si vous utilisez une assignation de port dynamique, substituez la valeur appropriée. Si le numéro de port change, vous devez mettre à jour le fichier .config généré par l'outil Svcutil.exe afin de correspondre au nouveau numéro de port.

    Le nom du fichier .svc dans la commande doit correspondre au nom utilisé pour créer le fichier .svc antérieur dans cette procédure pas à pas. Le nom du fichier de classe proxy est arbitraire ; dans cet exemple, le nom de classe proxy correspond au nom du fichier .svc correspondant.

  4. Remplacez le nom output.config du fichier de configuration qui a été généré par l'utilitaire de service par le nom App.config.

  5. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom de l'application console, cliquez sur Ajouter, cliquez sur Élément existant, sélectionnez le fichier de classe proxy AuthenticationService que vous avez généré, puis cliquez sur Ajouter.

  6. Dans le fichier de classe principal de l'application console, ajoutez le code suivant pour créer 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");
        }
    }
    

    Le code vous permet de transmettre un nom d'utilisateur et un mot de passe au service lorsque vous l'exécutez à partir de l'application console. Vous pouvez utiliser les valeurs des noms d'utilisateurs et des mots de passe que vous avez créés précédemment dans la procédure pas à pas.

    L'application de test obtient les informations de liaison et les informations sur le point de terminaison à partir du fichier App.config.

  7. Testez le projet en procédant comme suit :

    1. Dans Visual Studio, générez la solution.

    2. Sur la ligne de commande, passez au dossier \bin\debug et exécutez AppSvcClient.exe. Indiquez un nom d'utilisateur et un mot de passe sur la ligne de commande.

    L'application console affiche un message qui indique que vous avez ouvert une session.

  8. Générez la classe proxy du service de profil en copiant la commande suivante dans la fenêtre Commande 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'option /config:app.config désigne le fichier App.config comme fichier de configuration au lieu du fichier output.config, lequel est le fichier par défaut. L'option /mergeConfig spécifie que les informations de configuration qui sont générées lors de cette étape doivent être fusionnées avec les informations des étapes précédentes qui figurent déjà dans le fichier App.config.

  9. Générez la classe proxy du service d'authentification en copiant la commande suivante dans la fenêtre Commande 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. Générez la classe proxy du service de rôle en copiant la commande suivante dans la fenêtre Commande 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. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom de l'application console, cliquez sur Ajouter, cliquez sur Élément existant, sélectionnez les fichiers de classe proxy que vous avez générés, puis cliquez sur Ajouter.

    Les classes proxy figurent dans le même dossier que le fichier App.config et sont nommées AuthenticationService, ProfileService et RoleService.

  12. Remplacez le code contenu dans la classe Program par le code suivant :

    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. Générez le projet.

Accès aux services d'application

Vous pouvez maintenant exécuter l'application cliente et utiliser les services d'application que vous avez exposés dans le cadre du site Web.

Pour exécuter l'Application Windows

  1. À l'invite de commandes Windows, activez le répertoire de l'application console.

  2. Entrez la commande suivante avec le nom d'utilisateur et le mot de passe de l'un des utilisateurs que vous avez créés précédemment dans la procédure pas à pas :

    AppSvcClient.exe <userName> <password>

    Si vous avez entré les informations d'identification correctes, vous serez authentifié et pourrez obtenir les informations de rôle et de profil associées à l'utilisateur connecté.

Étapes suivantes

Cette procédure pas à pas a illustré les principes de base de l'accès aux services d'application ASP.NET à partir d'une application cliente pouvant envoyer et recevoir des messages au format SOAP.

Vous pouvez essayer les autres fonctionnalités du service d'application. Les suggestions supplémentaires d'exploration incluent notamment :

Pour des informations générales sur les services Web, vous pouvez :

  • Comprendre le traitement qui a lieu lorsque vous appelez un service Web. Pour plus d'informations, consultez Anatomie de la durée de vie d'un service Web XML.

  • Comprendre comment utiliser les services Web. Pour plus d'informations, consultez Scénarios de services Web XML.

  • En savoir plus sur les services d'application ASP.NET Pour plus d'informations, consultez AuthenticationServiceLogin().

Voir aussi

Tâches

Comment : activer le service d'authentification de WCF

Comment : activer le service de rôle de WCF

Comment : activer le service de profil de WCF

Concepts

Définition des propriétés de profil ASP.NET

Vue d'ensemble des services d'application ASP.NET