Dodawanie systemu ASP.NET Identity do pustego lub istniejącego projektu Web Forms

W tym samouczku pokazano, jak dodać ASP.NET Identity (nowy system członkostwa dla ASP.NET) do aplikacji ASP.NET.

Po utworzeniu nowych formularzy sieci Web lub projektu MVC w programie Visual Studio 2017 RTM przy użyciu poszczególnych kont program Visual Studio zainstaluje wszystkie wymagane pakiety i doda wszystkie niezbędne klasy. Ten samouczek ilustruje procedurę dodawania obsługi ASP.NET Identity do istniejącego projektu formularzy sieci Web lub nowego pustego projektu. Chcę utworzyć konspekt wszystkich pakietów NuGet, które należy zainstalować, oraz klas, które należy dodać. Przejdziemy na przykładowe formularze sieci Web na potrzeby rejestrowania nowych użytkowników i logowania przy wyróżnieniu wszystkich głównych interfejsów API punktu wejścia na potrzeby zarządzania użytkownikami i ich uwierzytelniania. W tym przykładzie zostanie użyta domyślna implementacja usługi SQL Data Storage ASP.NET Identity, która jest oparta na Entity Framework. W tym samouczku będziemy używać usługi LocalDB dla bazy danych SQL.

Wprowadzenie do ASP.NET Identity

  1. Zacznij od zainstalowania i uruchomienia programu Visual Studio 2017.

  2. Wybierz pozycję Nowy projekt na stronie startowej lub użyj menu i wybierz pozycję plik, a następnie Nowy projekt.

  3. W okienku po lewej stronie rozwiń pozycję C#Wizualizacja , a następnie wybierz pozycję Sieć Web, a następnie ASP.NET aplikację sieci Web (.NET Framework) . Nadaj projektowi nazwę "WebFormsIdentity" i wybierz pozycję OK.

  4. W oknie dialogowym Nowy projekt ASP.NET wybierz pusty szablon.

    Zauważ, że przycisk Zmień uwierzytelnianie jest wyłączony i w tym szablonie nie jest dostępna żadna obsługa uwierzytelniania. Szablony Web Forms, MVC i Web API umożliwiają wybranie podejścia uwierzytelniania.

Dodawanie pakietów tożsamości do aplikacji

W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz pozycję Zarządzaj pakietami NuGet. Wyszukaj i zainstaluj pakiet Microsoft. ASPNET. Identity. EntityFramework .

Należy pamiętać, że ten pakiet zainstaluje pakiety zależności: EntityFramework i Microsoft ASP.NET Identity Core.

Dodaj formularz sieci Web, aby zarejestrować użytkowników

  1. W Eksplorator rozwiązańkliknij prawym przyciskiem myszy projekt, a następnie wybierz polecenie Dodaj, a następnie formularz sieci Web.

  2. W oknie dialogowym Określanie nazwy dla elementu Nazwij nowy Rejestrformularzy sieci Web, a następnie wybierz przycisk OK .

  3. Zastąp znaczniki w wygenerowanym pliku register. aspx poniższym kodem. Zmiany kodu są wyróżnione.

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Register.aspx.cs" Inherits="WebFormsIdentity.Register" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body style="font-family: Arial, Helvetica, sans-serif; font-size: small">
        <form id="form1" runat="server">
        <div>
            <h4 style="font-size: medium">Register a new user</h4>
            <hr />
            <p>
                <asp:Literal runat="server" ID="StatusMessage" />
            </p>                
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="UserName">User name</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="UserName" />                
                </div>
            </div>
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="Password">Password</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="Password" TextMode="Password" />                
                </div>
            </div>
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="ConfirmPassword">Confirm password</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="ConfirmPassword" TextMode="Password" />                
                </div>
            </div>
            <div>
                <div>
                    <asp:Button runat="server" OnClick="CreateUser_Click" Text="Register" />
                </div>
            </div>
        </div>
        </form>
    </body>
    </html>
    

    Note

    Jest to tylko uproszczona wersja pliku register. aspx , który jest tworzony podczas tworzenia nowego projektu ASP.NET Web Forms. Znacznik powyżej dodaje pola formularza i przycisk umożliwiający zarejestrowanie nowego użytkownika.

  4. Otwórz plik register.aspx.cs i Zastąp zawartość pliku następującym kodem:

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using System;
    using System.Linq;
    
    namespace WebFormsIdentity
    {
       public partial class Register : System.Web.UI.Page
       {
          protected void CreateUser_Click(object sender, EventArgs e)
          {
             // Default UserStore constructor uses the default connection string named: DefaultConnection
             var userStore = new UserStore<IdentityUser>();
             var manager = new UserManager<IdentityUser>(userStore);
    
             var user = new IdentityUser() { UserName = UserName.Text };
             IdentityResult result = manager.Create(user, Password.Text);
    
             if (result.Succeeded)
             {
                StatusMessage.Text = string.Format("User {0} was created successfully!", user.UserName);
             }
             else
             {
                StatusMessage.Text = result.Errors.FirstOrDefault();
             }
          }
       }
    }
    

    Note

    1. Powyższy kod jest uproszczoną wersją pliku register.aspx.cs , który jest tworzony podczas tworzenia nowego projektu ASP.NET Web Forms.
    2. Klasa IdentityUser jest domyślną implementacją EntityFramework interfejsu IUser . Interfejs IUser jest minimalnym interfejsem użytkownika na ASP.NET Identity Core.
    3. Klasa UserStore to domyślna implementacja EntityFramework magazynu użytkownika. Ta klasa implementuje minimalne interfejsy ASP.NET Identity rdzeń: IUserStore, IUserLoginStore, IUserClaimStore i IUserRoleStore.
    4. Klasa usermanager uwidacznia interfejsy API powiązane z użytkownikiem, które będą automatycznie zapisywać zmiany w UserStore.
    5. Klasa IdentityResult reprezentuje wynik operacji tożsamości.
  5. W Eksplorator rozwiązańkliknij prawym przyciskiem myszy projekt, a następnie wybierz polecenie Dodaj, Dodaj folder ASP.NET , a następnie aplikacja_dane.

  6. Otwórz plik Web. config i Dodaj wpis parametrów połączenia dla bazy danych, która będzie używana do przechowywania informacji o użytkowniku. Baza danych zostanie utworzona w czasie wykonywania przez EntityFramework dla jednostek tożsamości. Parametry połączenia są podobne do tych, które zostały utworzone podczas tworzenia nowego projektu formularzy sieci Web. Wyróżniony kod pokazuje znacznik, który należy dodać:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      For more information on how to configure your ASP.NET application, please visit
      https://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit https://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
       <connectionStrings>
          <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\WebFormsIdentity.mdf;Initial Catalog=WebFormsIdentity;Integrated Security=True"
                providerName="System.Data.SqlClient" />
       </connectionStrings>
      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      </system.web>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
      </entityFramework>
    </configuration>
    

    Note

    W przypadku programu Visual Studio 2015 lub nowszego Zastąp (localdb)\v11.0 z (localdb)\MSSQLLocalDB w parametrach połączenia.

  7. Kliknij prawym przyciskiem myszy plik register. aspx w projekcie i wybierz polecenie Ustaw jako stronę startową. Naciśnij kombinację klawiszy CTRL + F5, aby skompilować i uruchomić aplikację sieci Web. Wprowadź nową nazwę użytkownika i hasło, a następnie wybierz pozycję zarejestruj.

    Note

    ASP.NET Identity obsługuje walidację, a w tym przykładzie można sprawdzić domyślne zachowanie funkcji sprawdzania poprawności użytkowników i haseł pochodzących z pakietu Identity Core. Domyślny moduł walidacji dla użytkownika (UserValidator) ma właściwość AllowOnlyAlphanumericUserNames, która ma ustawioną wartość domyślną true. Domyślny moduł sprawdzania poprawności hasła (MinimumLengthValidator) gwarantuje, że hasło ma co najmniej 6 znaków. Te moduły sprawdzania poprawności są właściwościami UserManager, które mogą zostać zastąpione, jeśli chcesz mieć niestandardową weryfikację

Sprawdź bazę danych tożsamości LocalDb i tabele wygenerowane przez Entity Framework

  1. W menu Widok wybierz Eksplorator serwera.

  2. Rozwiń węzeł DefaultConnection (WebFormsIdentity) , rozwiń węzeł tabele, kliknij prawym przyciskiem myszy pozycję AspNetUsers , a następnie wybierz polecenie Pokaż dane tabeli.


Konfigurowanie aplikacji na potrzeby uwierzytelniania OWIN

W tym momencie dodaliśmy obsługę tworzenia użytkowników. Teraz będziemy demonstrować, jak możemy dodać uwierzytelnianie, aby zalogować użytkownika. ASP.NET Identity używa oprogramowania pośredniczącego Microsoft OWIN Authentication do uwierzytelniania formularzy. Uwierzytelnianie plików cookie OWIN to mechanizm uwierzytelniania oparty na plikach cookie i oświadczenia, który może być używany przez dowolną platformę hostowaną w usłudze Owin lub IIS. Przy użyciu tego modelu można używać tych samych pakietów uwierzytelniania dla wielu platform, w tym ASP.NET MVC i Web Forms. Aby uzyskać więcej informacji o programie Project Katana i sposobach uruchamiania oprogramowania pośredniczącego w niezależny od hosta, zobacz wprowadzenie z projektem Katana.

Instalowanie pakietów uwierzytelniania w aplikacji

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz pozycję Zarządzaj pakietami NuGet. Wyszukaj i zainstaluj pakiet Microsoft. ASPNET. Identity. Owin .

  2. Wyszukaj i zainstaluj pakiet Microsoft. Owin. host. SystemWeb .

    Note

    Pakiet Microsoft. ASPNET. Identity. Owin zawiera zestaw klas rozszerzeń Owin do zarządzania i konfigurowania oprogramowania pośredniczącego uwierzytelniania Owin, które ma być używane przez pakiety ASP.NET Identity Core. Pakiet Microsoft. Owin. host. SystemWeb zawiera serwer Owin, który umożliwia uruchamianie aplikacji opartych na Owin w usługach IIS przy użyciu potoku żądań ASP.NET. Aby uzyskać więcej informacji , zobacz Owin oprogramowania pośredniczącego w zintegrowanym potoku usług IIS.

Dodaj klasy konfiguracji uruchamiania i uwierzytelniania OWIN

  1. W Eksplorator rozwiązańkliknij prawym przyciskiem myszy projekt, wybierz polecenie Dodaj, a następnie Dodaj nowy element. W oknie dialogowym Wyszukiwanie pola tekstowego wpisz "Owin". Nadaj klasie nazwę "Startup" i wybierz pozycję Dodaj.

  2. W pliku Startup.cs Dodaj wyróżniony kod przedstawiony poniżej, aby skonfigurować uwierzytelnianie OWIN plików cookie.

    using Microsoft.AspNet.Identity;
    using Microsoft.Owin;
    using Microsoft.Owin.Security.Cookies;
    using Owin;
    
    [assembly: OwinStartup(typeof(WebFormsIdentity.Startup))]
    
    namespace WebFormsIdentity
    {
       public class Startup
       {
          public void Configuration(IAppBuilder app)
          {
             // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=316888
             app.UseCookieAuthentication(new CookieAuthenticationOptions
             {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Login")
             });
          }
       }
    }
    

    Note

    Ta klasa zawiera atrybut OwinStartup służący do określania klasy startowej OWIN. Każda aplikacja OWIN ma klasę uruchomieniową, w której można określić składniki dla potoku aplikacji. Aby uzyskać więcej informacji na temat tego modelu, zobacz wykrywanie klasy startowej Owin .

Dodawanie formularzy sieci Web na potrzeby rejestrowania i logowania użytkowników

  1. Otwórz plik register.aspx.cs i Dodaj następujący kod, który loguje się do użytkownika po pomyślnym zarejestrowaniu.

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.Owin.Security;
    using System;
    using System.Linq;
    using System.Web;
    
    namespace WebFormsIdentity
    {
       public partial class Register : System.Web.UI.Page
       {
          protected void CreateUser_Click(object sender, EventArgs e)
          {
             // Default UserStore constructor uses the default connection string named: DefaultConnection
             var userStore = new UserStore<IdentityUser>();
             var manager = new UserManager<IdentityUser>(userStore);
             var user = new IdentityUser() { UserName = UserName.Text };
    
             IdentityResult result = manager.Create(user, Password.Text);
    
             if (result.Succeeded)
             {
                var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
                var userIdentity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
                authenticationManager.SignIn(new AuthenticationProperties() { }, userIdentity);
                Response.Redirect("~/Login.aspx");
             }
             else
             {
                StatusMessage.Text = result.Errors.FirstOrDefault();
             }
          }
       }
    }
    

    Note

    • Ponieważ ASP.NET Identity i OWIN uwierzytelnianie plików cookie to system oparty na oświadczeniach, struktura wymaga, aby Deweloper aplikacji generował Identyfikator oświadczenia dla użytkownika. Identyfikator oświadczenia zawiera informacje o wszystkich oświadczeniach dla użytkownika, takich jak role, do których należy użytkownik. Możesz również dodać więcej oświadczeń dla użytkownika na tym etapie.
    • Użytkownik może zalogować się przy użyciu metody AuthenticationManager z OWIN i wywoływać SignIn i przekazywać w identyfikator oświadczenia, jak pokazano powyżej. Ten kod zarejestruje użytkownika i wygeneruje również plik cookie. To wywołanie jest analogiczne do FormAuthentication. SetAuthCookie używane przez moduł FormsAuthentication .
  2. W Eksplorator rozwiązańkliknij prawym przyciskiem myszy projekt, wybierz polecenie Dodaj, a następnie formularz sieci Web. Nadaj nazwę logowaniaformularza sieci Web.

  3. Zastąp zawartość pliku login. aspx następującym kodem:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="WebFormsIdentity.Login" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
       <title></title>
    </head>
    <body style="font-family: Arial, Helvetica, sans-serif; font-size: small">
       <form id="form1" runat="server">
          <div>
             <h4 style="font-size: medium">Log In</h4>
             <hr />
             <asp:PlaceHolder runat="server" ID="LoginStatus" Visible="false">
                <p>
                   <asp:Literal runat="server" ID="StatusText" />
                </p>
             </asp:PlaceHolder>
             <asp:PlaceHolder runat="server" ID="LoginForm" Visible="false">
                <div style="margin-bottom: 10px">
                   <asp:Label runat="server" AssociatedControlID="UserName">User name</asp:Label>
                   <div>
                      <asp:TextBox runat="server" ID="UserName" />
                   </div>
                </div>
                <div style="margin-bottom: 10px">
                   <asp:Label runat="server" AssociatedControlID="Password">Password</asp:Label>
                   <div>
                      <asp:TextBox runat="server" ID="Password" TextMode="Password" />
                   </div>
                </div>
                <div style="margin-bottom: 10px">
                   <div>
                      <asp:Button runat="server" OnClick="SignIn" Text="Log in" />
                   </div>
                </div>
             </asp:PlaceHolder>
             <asp:PlaceHolder runat="server" ID="LogoutButton" Visible="false">
                <div>
                   <div>
                      <asp:Button runat="server" OnClick="SignOut" Text="Log out" />
                   </div>
                </div>
             </asp:PlaceHolder>
          </div>
       </form>
    </body>
    </html>
    
  4. Zastąp zawartość pliku login.aspx.cs następującym:

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.Owin.Security;
    using System;
    using System.Web;
    using System.Web.UI.WebControls;
    
    namespace WebFormsIdentity
    {
       public partial class Login : System.Web.UI.Page
       {
          protected void Page_Load(object sender, EventArgs e)
          {
             if (!IsPostBack)
             {
                if (User.Identity.IsAuthenticated)
                {
                   StatusText.Text = string.Format("Hello {0}!!", User.Identity.GetUserName());
                   LoginStatus.Visible = true;
                   LogoutButton.Visible = true;
                }
                else
                {
                   LoginForm.Visible = true;
                }
             }
          }
    
          protected void SignIn(object sender, EventArgs e)
          {
             var userStore = new UserStore<IdentityUser>();
             var userManager = new UserManager<IdentityUser>(userStore);
             var user = userManager.Find(UserName.Text, Password.Text);
    
             if (user != null)
             {
                var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
                var userIdentity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
    
                authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, userIdentity);
                Response.Redirect("~/Login.aspx");
             }
             else
             {
                StatusText.Text = "Invalid username or password.";
                LoginStatus.Visible = true;
             }
          }
    
          protected void SignOut(object sender, EventArgs e)
          {
             var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
             authenticationManager.SignOut();
             Response.Redirect("~/Login.aspx");
          }
       }
    }
    

    Note

    • Page_Load teraz sprawdza stan bieżącego użytkownika i podejmuje akcję na podstawie jego stanu Context.User.Identity.IsAuthenticated. Wyświetl zalogowany użytkownik nazwa użytkownika Microsoft ASP.NET: IIdentity Identity Framework dodał metody rozszerzenia do System. Security. Principal. , które umożliwiają uzyskanie UserName i UserId dla zalogowanego użytkownika. Te metody rozszerzające są zdefiniowane w zestawie Microsoft.AspNet.Identity.Core. Te metody rozszerzające są zamiennikiem HttpContext.User.Identity.Name .
    • Metoda logowania: Metoda This zastępuje poprzednią metodę CreateUser_Click w tym przykładzie i teraz loguje się do użytkownika po pomyślnym utworzeniu użytkownika.
      Program Microsoft OWIN Framework dodał metody rozszerzenia na System.Web.HttpContext, które umożliwiają uzyskanie odwołania do IOwinContext. Te metody rozszerzające są zdefiniowane w zestawie Microsoft.Owin.Host.SystemWeb. Klasa OwinContext uwidacznia Właściwość IAuthenticationManager, która reprezentuje funkcje oprogramowania pośredniczącego uwierzytelniania dostępne w bieżącym żądaniu. Użytkownik może zalogować się przy użyciu AuthenticationManager z OWIN i wywołując SignIn i przekazywać w ClaimsIdentity jak pokazano powyżej. Ponieważ ASP.NET Identity i OWIN uwierzytelnianie plików cookie to system oparty na oświadczeniach, struktura wymaga, aby aplikacja generowała ClaimsIdentity dla użytkownika. ClaimsIdentity zawiera informacje o wszystkich oświadczeniach dla użytkownika, takich jak role, do których należy użytkownik. Możesz również dodać więcej oświadczeń dla użytkownika na tym etapie ten kod zarejestruje użytkownika i wygeneruje również plik cookie. To wywołanie jest analogiczne do FormAuthentication. SetAuthCookie używane przez moduł FormsAuthentication .
    • SignOut Metoda: pobiera odwołanie do AuthenticationManager z OWIN i wywołuje SignOut. Jest to analogiczny do metody FormsAuthentication. wylogowaniu używanej przez moduł FormsAuthentication .
  5. Naciśnij kombinację klawiszy CTRL + F5 , aby skompilować i uruchomić aplikację sieci Web. Wprowadź nową nazwę użytkownika i hasło, a następnie wybierz pozycję zarejestruj.


    Uwaga: w tym momencie nowy użytkownik zostanie utworzony i zalogowany.

  6. Wybierz przycisk Wyloguj . Nastąpi przekierowanie do formularza logowania.

  7. Wprowadź nieprawidłową nazwę użytkownika lub hasło, a następnie wybierz przycisk Zaloguj się . Metoda UserManager.Find zwróci wartość null i zostanie wyświetlony komunikat o błędzie: " Nieprawidłowa nazwa użytkownika lub hasło " zostanie wyświetlona.