Freigeben über


Exemplarische Vorgehensweise: Verwenden von ASP.NET-Anwendungsdiensten

Aktualisiert: November 2007

ASP.NET bietet Anwendungsdienste im Web, mit denen Clientanwendungen auf Informationen über Benutzerauthentifizierung, Rollen und Profile zugreifen können. Auf diese Informationen kann von Clientanwendungen zugegriffen werden, die in verschiedenen Sprachen geschrieben sind und die auf verschiedenen Betriebssystemen ausgeführt werden. Die einzige Voraussetzung ist, dass diese Clients über das SOAP 1.1-Protokoll kommunizieren können müssen.

Diese exemplarische Vorgehensweise ist in folgende Teile gegliedert:

  • In Teil 1 wird gezeigt, wie eine ASP.NET-Website für die Bereitstellung der Anwendungsdienste konfiguriert wird.

  • In Teil 2 wird gezeigt, wie eine Windows-Konsolenanwendung erstellt wird, die auf Benutzerinformationen wie Authentifizierung, Rollen und Profile zugreift. In dieser exemplarischen Vorgehensweise erstellen Sie eine Windows-Konsolenanwendung. Die ASP.NET-Anwendungsdienste stehen jedoch für beliebige Clientanwendungen zur Verfügung, die Nachrichten im SOAP-Format senden und empfangen können.

Vorbereitungsmaßnahmen

Für die Durchführung dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:

  • Visual Studio 2008. Microsoft Visual Web Developer 2005 können Sie für diese exemplarische Vorgehensweise nicht verwenden, da eine Windows-Konsolenanwendung erstellt wird, die in Visual Web Developer Express Edition nicht unterstützt wird.

  • Microsoft SQL Server oder SQL Express Edition ist auf dem Computer installiert.

Bereitstellen der Anwendungsdienste

In diesem Abschnitt wird beschrieben, wie die Anwendungsdienste als Teil einer ASP.NET-Website bereitgestellt werden, sodass ein beliebiger Client im Netzwerk darauf zugreifen kann. Die hier beschriebenen Schritte gelten nur für den Server.

Hinweis:

In dieser exemplarischen Vorgehensweise muss eine Dateisystem-Website verwendet werden. Bei den Beispielen dieser exemplarischen Vorgehensweise wird davon ausgegangen, dass Sie mit ASP.NET Development Server anstelle von IIS arbeiten. Weitere Informationen hierzu finden Sie unter Webserver in Visual Web Developer.

So erstellen Sie die Website mit den Anwendungsdiensten

  1. Öffnen Sie Visual Studio 2008.

  2. Klicken Sie im Menü Datei auf Neue Website.

    Das Dialogfeld Neue Website wird angezeigt.

  3. Wählen Sie unter Von Visual Studio installierte Vorlagen die Option ASP.NET-Website aus.

  4. Wählen Sie in der Liste Speicherort den Eintrag Dateisystem aus.

  5. Geben Sie im Textfeld Ordner als Namen für die Website WcfApplicationServices ein.

    Hinweis:

    Sie können einen beliebigen Namen verwenden. Wenn Sie einen anderen Namen verwenden, notieren Sie den Namen für die spätere Verwendung in dieser exemplarischen Vorgehensweise.

  6. Klicken Sie auf OK.

    Visual Studio erstellt eine neue ASP.NET-Website und öffnet die Seite Default.aspx.

  7. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Namen der Website, und drücken Sie anschließend F4, um das Fenster Eigenschaften zu öffnen.

  8. Legen Sie im Fenster Eigenschaften den Eintrag Dynamische Anschlüsse verwenden auf False fest.

    Dadurch wird von Visual Studio ein fester Anschluss anstelle eines zufällig ausgewählten Anschlusses festgelegt, wenn ASP.NET Development Server gestartet wird. Für diese exemplarische Vorgehensweise muss eine feste Anschlussnummer verwendet werden, die beim Erstellen der Clientproxyklassen und Konfigurationsdateien verwendet werden kann. Weitere Informationen hierzu finden Sie unter Gewusst wie: Angeben eines Anschlusses für den ASP.NET Development Server.

    Hinweis:

    Sie können das Fenster Eigenschaften der Website nicht über das Fenster Eigenschaftenseiten öffnen.

  9. Legen Sie als Anschlussnummer den Wert 8080 fest.

    Hinweis:

    Sie können einen beliebigen verfügbaren Anschluss verwenden. Wenn Sie einen anderen Anschluss verwenden, notieren Sie dessen Nummer, um sie gegen die Nummer 8080 im Verlauf dieser exemplarischen Vorgehensweise auszutauschen.

ASP.NET-Informationen zu Mitgliedschaft, Rollen und Profilen werden in einer Datenbank gespeichert. Diese Datenbank wird bei Bedarf automatisch erstellt. Im nächsten Verfahren erstellen Sie Benutzer und Rollen für die Anwendung, wodurch die Datenbank automatisch erstellt wird.

So erstellen Sie Benutzer und Rolleninformationen

  1. Fügen Sie der Website eine Global.asax-Datei hinzu, und ersetzen Sie in der Datei die vorhandene Application_Start-Methode durch folgenden Code:

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

    Bei der ersten Ausführung der Webanwendung wird im Code die lokale Datenbank Aspnetdb.mdf erstellt. Anschließend werden die Rollen Administrators und Friends hinzugefügt. In der Datenbank werden Benutzeranmeldeinformationen, Rollen und Profilinformationen gespeichert.

  2. Öffnen Sie die Seite Default.apx, und fügen Sie das folgende Markup hinzu. Hiermit werden Links für die Anmeldeseite, die Seite mit Profilinformationen und die neue Benutzerseite hinzugefügt. Sie fügen diese Seiten später in der exemplarischen Vorgehensweise hinzu.

    <%@ 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. Fügen Sie in der Code-Behind-Datei für die Seite Default.aspx in der Page_Load-Methode Code hinzu, der überprüft, ob der Benutzer authentifiziert ist.

    Das folgende Beispiel zeigt, wie Sie die Authentifizierung eines Benutzers überprüfen.

    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. Fügen Sie eine Seite mit dem Namen Login.aspx hinzu. Stellen Sie sicher, dass das Kontrollkästchen Code in eigener Datei platzieren aktiviert ist.

  5. Fügen Sie der Datei Login.aspx ein Login-Steuerelement hinzu.

    Im folgenden Beispiel wird das Markup für die Datei Login.aspx veranschaulicht:

    <%@ 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. Fügen Sie eine Seite mit dem Namen Profile.aspx hinzu, und stellen Sie sicher, dass Code in eigener Datei platzieren ausgewählt ist.

  7. Fügen Sie der Seite Profile.aspx das folgende Markup hinzu:

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

    Die Profilseite beinhaltet Label-Steuerelemente, mit denen Name und Rolle des Benutzers angezeigt werden, sowie TextBox-Steuerelemente zum Ändern des Benutzernamens und der ID.

  8. Fügen Sie der Code-Behind-Datei für die Seite Profile.aspx den folgenden Code hinzu:

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

    Im vorangegangenen Beispiel wurde der Klassenname in der Code-Behind-Datei in _Profile geändert, um einen Konflikt mit der Profile-Instanz zu verhindern.

    Mit dem Code auf dieser Seite können Sie Benutzerprofilinformationen abrufen und ändern.

    Hinweis:

    Das Projekt wird erst dann kompiliert, wenn Sie die Profileigenschaften für die Website aktiviert haben. Diesen Schritt führen Sie in der nächsten Prozedur durch.

  9. Fügen Sie eine Seite mit dem Namen CreateUser.aspx hinzu, und fügen Sie dieser das folgende Markup hinzu:

    <%@ 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. Fügen Sie der Code-Behind-Datei für die Seite CreateUser.aspx den folgenden Code hinzu.

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

    Mithilfe dieser Seite können Sie Benutzer erstellen und diesen eine Rolle zuweisen.

Als Nächstes werden die Eigenschaften für Formularauthentifizierung, Rollen und Profile für die Website aktiviert. Dies wird in den Konfigurationseinstellungen der Datei Web.config durchgeführt.

So konfigurieren Sie Eigenschaften für Authentifizierung, Rollen und Profile

  1. Öffnen Sie die Datei Web.config der Website.

  2. Ändern Sie in der system.web-Gruppe den Standardmodus der Windows-Authentifizierung in "Formular", wie im folgenden Beispiel gezeigt:

    <authentication mode="Forms" />
    
  3. Konfigurieren Sie in der system.web-Gruppe den Rollendienst, indem Sie das roleManager-Element hinzufügen, wie im folgenden Beispiel gezeigt:

    <roleManager enabled="true"/>
    
  4. Konfigurieren Sie in der system.web-Gruppe im Abschnitt profile mit dem properties-Element den Profildienst, wie im folgenden Beispiel gezeigt:

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

    Diese Profileinstellung definiert drei Eigenschaften, die durch den ASP.NET-Profildienst verwaltet werden. Zur Laufzeit erstellt ASP.NET dynamisch eine Klasse des Typs ProfileCommon, die diese Eigenschaften enthält.

    Im folgenden Beispiel wird ein Teil der Datei Web.config mit allen erforderlichen Änderungen gezeigt.

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

Sie können nun Benutzerinformationen erstellen, die später bei der Anmeldung verwendet werden.

So erstellen Sie Benutzer und weisen Profilinformationen zu

  1. Klicken Sie im Projektmappen-Explorer auf die Seite Default.aspx, und drücken Sie dann STRG+F5, um die Seite auszuführen.

    Die Seite wird mit folgender URL im Browser angezeigt:

    https://localhost:8080/WcfApplicationServices/Default.aspx
    
  2. Klicken Sie auf New User.

    Die Seite CreateUser.aspx wird angezeigt.

  3. Erstellen Sie Benutzer, und weisen Sie diesen die vordefinierten Rollen zu. Geben Sie dazu die Anmeldeinformationen des Benutzers ein, und klicken Sie dann auf Create User.

    Zeichnen Sie die erstellten Benutzernamen und Kennwörter auf. Diese werden zum Zuweisen und Ändern der Benutzerprofilinformationen benötigt.

    Erstellen Sie z. B. einen Benutzer mit dem Benutzernamen "joeA", und aktivieren Sie das Kontrollkästchen Administrator, um joeA als Mitglied der Administrators-Rolle hinzuzufügen. Erstellen Sie einen zweiten Benutzer mit einem Benutzernamen "joeNA", und aktivieren Sie das Kontrollkästchen Administrator nicht. Der Benutzer joeNA ist ein Mitglied der Friends-Rolle, nicht aber der Administrators-Rolle. Die Rollen Friends und Administrators werden von einem Code erstellt, den Sie zuvor zur Application_Start-Methode in der Datei Global.asax hinzugefügt haben.

    Nachdem ein Benutzer erstellt wurde, werden Sie zur Seite Default.aspx weitergeleitet.

  4. Klicken Sie auf der Seite Default.aspx auf Login.

    Die Seite Login.aspx wird angezeigt.

  5. Melden Sie sich mit den Anmeldeinformationen eines der zuvor erstellten Benutzer an.

    Wenn die Anmeldung erfolgreich ist, werden Sie zur Seite Default.aspx weitergeleitet.

  6. Klicken Sie auf Profile Information.

    Die Seite Profile.aspx wird angezeigt.

  7. Geben Sie die Profilinformationen des angemeldeten Benutzers anhand des Vornamens, Nachnamens und der ID ein, bzw. aktualisieren Sie diese.

  8. Klicken Sie auf Update Profile Data.

  9. Klicken Sie auf Read Profile Information.

    Die von Ihnen gerade eingegebenen Informationen werden angezeigt. Dadurch können Sie sicherstellen, dass die Profileigenschaften funktionieren.

Sie haben das Erstellen von Benutzern und Profilinformationen abgeschlossen. Sie werden nun diese Informationen Clientanwendungen zur Verfügung stellen.

Zuordnen und Konfigurieren der Anwendungsdienste

Sie können jetzt die erstellten Benutzerinformationen mit den ASP.NET-Anwendungsdiensten verfügbar machen. Bevor Sie auf die Anmelde- und Profilinformationen des Benutzers vom Client aus zugreifen können, müssen Sie Zuordnungsdateien (.svc) erstellen, die auf die Anwendungsdienste verweisen. Dadurch werden die Dienste für jede Anwendung verfügbar gemacht, die auf einer Plattform ausgeführt wird, die SOAP-Meldungen senden und empfangen kann. Auch die Website muss entsprechend konfiguriert werden, damit die Anwendungsdienste im Netzwerk verfügbar sind.

So erstellen Sie Zuordnungsdateien für Anwendungsdienste

  1. Fügen Sie der Website eine WCF-Dienstdatei (.svc) hinzu, und nennen Sie diese MyAuthenSvcWrap.svc.

  2. Ersetzen Sie die vorhandene @ ServiceHost-Direktive durch die folgende Direktive, die auf die System.Web.ApplicationServices.AuthenticationService-Klasse verweist:

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

    Dieser Beispieldienst implementiert keinen benutzerdefinierten Authentifizierungsdienst. Stattdessen wird die integrierte System.Web.ApplicationServices.AuthenticationService-Klasse aufgerufen.

  3. Löschen Sie die Schnittstellen- und Klassendateien im Verzeichnis App_Code (App_Code\MyAuthenSvcWrap und App_Code\IMyAuthenSvcWrap).

    Die Schnittstellen- und Klassendateien wurden beim Hinzufügen der SVC-Datei zum Projekt erstellt. Sie benötigen diese Dateien nicht, da Sie den System.Web.ApplicationServices.AuthenticationService-Dienst verwenden und keinen benutzerdefinierten Dienst implementieren.

  4. Fügen Sie der Website eine weitere WCF-Dienstdatei (.svc) hinzu, und nennen Sie diese MyRoleSvcWrap.svc.

  5. Öffnen Sie die Datei MyRoleSvcWrap.svc, und ersetzen Sie den Inhalt durch die folgende @ ServiceHost-Direktive, wodurch ein Verweis auf die System.Web.ApplicationServices.RoleService-Klasse erstellt wird:

    <%@ 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. Löschen im Verzeichnis App_Code die Schnittstellen- und Klassendateien für den MyRoleSvcWrap-Dienst.

  7. Fügen Sie der Website eine weitere WCF-Dienstdatei (.svc) hinzu, und nennen Sie diese MyProfileSvcWrap.svc.

  8. Öffnen Sie die Datei MyProfileSvcWrap.svc, und ersetzen Sie den Inhalt durch die folgende Direktive, wodurch ein Verweis auf die System.Web.ApplicationServices.ProfileService-Klasse erstellt wird:

    <%@ 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. Löschen im Verzeichnis App_Code die Schnittstellen- und Klassendateien für den MyProfileSvcWrap-Dienst.

  10. Speichern und schließen Sie alle SVC-Dateien.

Nun können Sie die Webanwendung für die Bereitstellung der Anwendungsdienste konfigurieren.

So konfigurieren Sie die Anwendungsdienste

  1. Wechseln Sie zur Datei Web.config, oder öffnen Sie sie.

  2. Fügen Sie unterhalb des configSections-Abschnitts einen neuen system.web.extensions-Abschnitt ein.

  3. Aktivieren Sie im scripting-Element den Anwendungsdienst über den webServices-Abschnitt.

    Im folgenden Beispiel wird das fertige system.web.extensions-Element veranschaulicht.

    </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. Fügen Sie als untergeordnetes Element des system.serviceModel-Abschnitts ein serviceHostingEnvironment-Element hinzu, und legen Sie für aspNetCompatibilityEnabled dieses Elements den Wert true fest.

    Im folgenden Beispiel wird das fertige serviceHostingEnvironment-Element veranschaulicht.

    </runtime>
     <system.serviceModel>
       <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    
  5. Konfigurieren Sie in der system.serviceModel-Gruppe die Anwendungsdienste so, dass auf sie mithilfe des SOAP-Protokolls von Clientanwendungen aus zugegriffen werden kann. Führen Sie dazu folgende Schritte aus:

    1. Suchen Sie im system.serviceModel-Element das <behaviors><serviceBehaviors><behavior>-Element, dessen Namensattribut den Wert "MyAuthenSvcWrapBehavior" hat.

    2. Ändern Sie den name-Attributwert des behavior-Elements von "MyAuthenSvcWrapBehavior" in "AppServiceBehaviors". In dieser exemplarischen Vorgehensweise konfigurieren Sie die Anwendung so, dass das AppServiceBehaviors-Verhalten für alle drei Dienste verwendet wird.

    3. Löschen Sie die behavior-Elemente mit den Namen "MyRoleSvcWrapBehavior" und "MyProfileSvcWrapBehavior" aus dem <system.serviceModel><behaviors><serviceBehaviors>-Element.

    Das folgende Beispiel zeigt den fertigen <system.serviceModel> -Abschnitt.

    </runtime>
     <system.serviceModel>
       <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
      <behaviors>
       <serviceBehaviors>
        <behavior name="AppServiceBehaviors">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
    
  6. Ändern Sie im <system.serviceModel><services><service>-Element mit dem Namen "MyAuthenSvcWrapBehavior" den behaviorConfiguration-Attributwert des behavior-Elements von "MyAuthenSvcWrapBehavior" in "AppServiceBehaviors".

  7. Ändern Sie den name-Attributwert von "MyAuthenSvcWrap" in "System.Web.ApplicationServices.AuthenticationService".

  8. Konfigurieren Sie das <service><endpoint>-Element folgendermaßen:

    1. Löschen Sie das address-Attribut.

    2. Ändern Sie den Wert des binding-Attributs von "wsHttpBinding" in "basicHttpBinding".

    3. Ändern Sie den Wert des contract-Attributs von "IMyAuthenSvcWrap" in "System.Web.ApplicationServices.AuthenticationService".

    4. Fügen Sie das bindingNamespace-Attribut hinzu, und legen Sie "https://asp.net/ApplicationServices/v200" als Wert für das Attribut fest.

    5. Löschen Sie das untergeordnete identity-Element.

    Das folgende Beispiel enthält das Markup für das authentication service-Element.

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

    Weitere Informationen hierzu finden Sie unter <service>-Element.

  9. Wiederholen Sie Schritt 8 für das MyAuthenSvcWrap-Element.

    Im folgenden Beispiel wird das vollständige system.serviceModel-Element veranschaulicht.

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

Nun können Sie die Website ausführen, um die Authentifizierungsdienste zu aktivieren, die von der Windows-Clientanwendung verwendet werden. Dabei können sie auch überprüfen, ob die Infrastruktur für die Anwendungsdienste ordnungsgemäß funktioniert.

So aktivieren Sie die Website für die Bereitstellung der Anwendungsdienste

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei MyAuthenSvcWrap.svc, und klicken Sie danach auf In Browser anzeigen.

    Der Webdienst wird aufgerufen, und im Browser wird eine Seite mit Anweisungen zum Testen des Diensts angezeigt. Notieren Sie die Dienst-URL, da Sie diese in den nächsten Schritten benötigen, um in der Clientanwendung auf den Dienst zuzugreifen.

    Hinweis:

    Schließen Sie den Browser nicht. Bei Verwendung von ASP.NET Development Server muss der Browser geöffnet bleiben, damit die Anwendungsdienste aktiv bleiben.

Sie haben die Konfiguration der Anwendungsdienste im Web abgeschlossen, sodass sie nun im Web zur Verfügung stehen. Im nächsten Schritt werden diese Dienste von einer Clientanwendung aus aufgerufen.

Verwenden der Anwendungsdienste

In diesem Abschnitt wird gezeigt, wie eine Clientanwendung in Form einer Windows-Konsolenanwendung erstellt wird, um auf die Anwendungsdienste zuzugreifen. Jede Clientanwendung, die Nachrichten im SOAP-Format senden und empfangen kann, kann auf die Anwendungsdienste zugreifen.

Um die Clientkonsolenanwendung zu erstellen, führen Sie diese allgemeinen Schritte durch:

  • Erstellen Sie die Clientanwendung.

  • Erstellen Sie die Proxydateien für die Anwendungsdienste sowie eine zugehörige Konfigurationsdatei.

  • Fügen Sie die erstellten Proxy- und Konfigurationsdateien der Clientanwendung hinzu, und kompilieren Sie die Anwendung.

  • Rufen Sie Operationen der Anwendungsdienste durch die erstellten Proxys auf.

    Hinweis:

    Verwenden Sie beim Senden vertraulicher Authentifizierungsinformationen an den Dienst SSL (Secure Sockets Layer, unter Verwendung des HTTPS-Protokolls). Im folgenden Beispiel würden Sie beispielsweise den Wert des requireSSL-Attributs im authenticationService-Element von "false" in "true" ändern. Weitere Informationen finden Sie unter Transport Security und HTTP Security and ASP.NET Web Services auf der MSDN-Website sowie unter Configuring Secure Sockets Layer in IIS 7.0 auf der IIS-Website.

So erstellen Sie eine Windows-Konsolenanwendung

  1. Klicken Sie in Visual Studio im Menü Datei auf Hinzufügen und dann auf Neues Projekt.

  2. Wählen Sie die bevorzugte Sprache aus, und wählen Sie dann unter Von Visual Studio installierte Vorlagen die Option Konsolenanwendung aus.

  3. Geben Sie der Anwendung den Namen AppSvcClient, geben Sie einen Speicherort für die Anwendung ein, und klicken Sie dann auf OK.

    Das Projekt wird von Visual Studio der aktuellen Projektmappe hinzugefügt, und die Standardklassendatei wird geöffnet.

  4. Klicken Sie mit der rechten Maustaste auf den Namen der Konsolenanwendung, und klicken Sie auf Verweis hinzufügen.

  5. Klicken Sie im Dialogfeld Verweis hinzufügen auf die Registerkarte .NET, wählen Sie System.ServiceModel und System.Runtime.Serialization aus, und klicken Sie dann auf OK.

    Dadurch werden dem Projekt Namespaces hinzugefügt, darunter auch Klassen, die für die Verwendung der Proxyklassen erforderlich sind.

Erstellen von Proxyklassen und Konfigurationsinformationen für Anwendungsdienste

Nun können Sie Proxyklassen und Konfigurationsinformationen erstellen, durch die über die AppSvcClient-Konsolenanwendung auf die Anwendungsdienste zugegriffen werden kann. Für jeden Anwendungsdienst wird eine eigene Proxyklasse und Konfiguration erstellt.

So erstellen Sie Proxyklassen für die Anwendungsdienste

  1. Klicken Sie im Windows-Startmenü auf Alle Programme, klicken Sie auf Microsoft Visual Studio 2008 und Visual Studio-Tools, und klicken Sie anschließend auf Visual Studio 2008-Eingabeaufforderung.

    Hinweis:

    Wenn Sie Microsoft Vista ausführen, führen Sie diesen Befehl als Administrator aus.

    Dadurch wird ein Windows-Befehlsfenster geöffnet, dessen Umgebungseinstellungen einen Pfad zu den .NET Framework-Tools einschließen.

  2. Wechseln Sie in der Windows-Befehlszeile in das Verzeichnis, das die Datei Program.cs oder Module1.vb für das AppSvcClient-Projekt enthält.

  3. Erstellen Sie die Proxyklasse für den Authentifizierungsdienst mithilfe des Dienstprogramm-Tools (Svcutil.exe). Geben Sie in der Windows-Befehlszeile, die Sie in Schritt 1 geöffnet haben, den folgenden Befehl ein:

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

       Standardmäßig ist die ausgegebene Sprache C#. Das Flag /language:"VB" ist nur für Visual Basic erforderlich.

    Der Wert „localhost:8080“ muss mit der URL übereinstimmen, die Sie zur Ausführung der Website in dieser exemplarischen Vorgehensweise verwenden. Wenn Sie eine andere Anschlussnummer für ASP.NET Development Server oder eine dynamische Anschlusszuweisung verwenden, tauschen Sie den Wert entsprechend aus. Wenn die Anschlussnummer geändert wird, muss die vom Tool Svcutil.exe generierte CONFIG-Datei entsprechend aktualisiert werden.

    Der Name der SVC-Datei im Befehl muss mit dem Namen übereinstimmen, den Sie bei der Erstellung der SVC-Datei zuvor in dieser exemplarischen Vorgehensweise verwendet haben. Der Dateiname der Proxyklassen ist frei wählbar. In diesem Fall stimmt der Proxyklassenname mit dem Namen der zugehörigen SVC-Datei überein.

  4. Benennen Sie die durch das Dienstprogramm-Tool generierte Konfigurationsdatei output.config in App.config um.

  5. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Namen der Konsolenanwendung. Klicken Sie auf Hinzufügen und anschließend auf Vorhandenes Element. Wählen Sie die von Ihnen erstellte AuthenticationService-Proxyklassendatei aus, und klicken Sie anschließend auf Hinzufügen.

  6. Fügen Sie in der Hauptklassendatei der Konsolenanwendung den folgenden Code hinzu, um einen Test zu erstellen.

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

    Mit diesem Code können ein Benutzername und ein Kennwort an den Dienst übergeben werden, wenn er in der Konsolenanwendung ausgeführt wird. Verwenden Sie dazu die Werte für Benutzer und Kennwörter, die Sie zuvor in dieser exemplarischen Vorgehensweise erstellt haben.

    Die Testanwendung übernimmt die Informationen zu Bindung und Endpunkt aus der Datei App.config.

  7. Testen Sie das Projekt, indem Sie wie folgt vorgehen:

    1. Erstellen Sie in Visual Studio die Projektmappe.

    2. Wechseln Sie in der Befehlszeile in den Ordner \bin\debug, und führen Sie AppSvcClient.exe aus. Übergeben Sie in der Befehlszeile einen Benutzernamen und ein Kennwort.

    Die Konsolenanwendung zeigt durch eine Meldung an, dass Sie sich angemeldet haben.

  8. Generieren Sie die Proxyklasse für den Profildienst, indem Sie den folgenden Befehl in das Windows-Befehlsfenster kopieren:

    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
    

    Die /config:app.config-Option wird verwendet, um die Datei App.config anstelle der Standarddatei output.config als Konfigurationsdatei auszuweisen. Die /mergeConfig-Option gibt an, dass die in diesem Schritt generierten Konfigurationsinformationen mit den Informationen zusammengeführt werden sollen, die bereits in den vorhergehenden Schritten in der Datei App.config gespeichert wurden.

  9. Generieren Sie die Proxyklasse für den Authentifizierungsdienst, indem Sie den folgenden Befehl in das Windows-Befehlsfenster kopieren:

    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. Generieren Sie die Proxyklasse für den Rollendienst, indem Sie den folgenden Befehl in das Windows-Befehlsfenster kopieren:

    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. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Namen der Konsolenanwendung. Klicken Sie auf Hinzufügen und anschließend auf Vorhandenes Element. Wählen Sie die von Ihnen erstellten Proxyklassendateien aus, und klicken Sie auf Hinzufügen.

    Die Proxyklassen befinden sich in demselben Ordner wie die Datei App.config und haben die Namen AuthenticationService, ProfileService und RoleService.

  12. Ersetzen Sie den Code in der Programmklasse durch den folgenden Code:

    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. Erstellen Sie das Projekt.

Zugreifen auf die Anwendungsdienste

Nun können Sie die Clientanwendung ausführen und die Anwendungsdienste verwenden, die Sie als Teil der Website bereitgestellt haben.

So führen Sie die Windows-Anwendung aus

  1. Wechseln Sie an der Windows-Eingabeaufforderung in das Konsolenanwendungsverzeichnis.

  2. Geben Sie den folgenden Befehl mit dem Benutzernamen und dem Kennwort eines der Benutzer ein, die Sie zuvor in dieser exemplarischen Vorgehensweise erstellt haben:

    AppSvcClient.exe <userName> <password>

    Wenn Sie die korrekten Anmeldeinformationen eingeben, werden Sie authentifiziert und können Rollen- und Profilinformationen abrufen, die mit dem angemeldeten Benutzer verknüpft sind.

Nächste Schritte

In dieser exemplarischen Vorgehensweise wurden die Grundprinzipien beim Zugriff auf ASP.NET-Anwendungsdienste aus einer Clientanwendung, die Meldungen im SOAP-Format senden und empfangen kann, veranschaulicht.

Möglicherweise möchten Sie sich mit weiteren Features von Anwendungsdiensten befassen. Sie können sich u. a. folgendermaßen weiter mit dem Thema befassen:

  • Erfahren Sie mehr über die Verwendung der Anwendungsdienste durch .NET Framework-Clients. Weitere Informationen finden Sie unter Übersicht über Clientanwendungsdienste.

  • Erfahren Sie mehr über Windows Communication Foundation (WCF) und den Datenaustausch mit dem Client im SOAP-Format. Weitere Informationen finden Sie unter XML Web Services Infrastructure auf der MSDN-Website.

Für allgemeine Informationen über Webdienste kann Folgendes hilfreich sein:

  • Verstehen der Verarbeitung beim Ausführen eines Webdienstaufrufs. Weitere Informationen finden Sie unter Aufbau der Lebensdauer von XML-Webdiensten.

  • Verstehen der Verwendung von Webdiensten. Weitere Informationen finden Sie unter XML-Webdienstszenarien.

  • Erfahren Sie mehr über ASP.NET-Anwendungsdienste. Weitere Informationen hierzu finden Sie unter AuthenticationServiceLogin().

Siehe auch

Aufgaben

Gewusst wie: Aktivieren des WCF-Authentifizierungsdiensts

Gewusst wie: Aktivieren des WCF-Rollendiensts

Gewusst wie: Aktivieren des WCF-Profildiensts

Konzepte

Definieren von ASP.NET-Profileigenschaften

Übersicht über die ASP.NET-Anwendungsdienste