Sdílet prostřednictvím


Přidání ASP.NET Identity do prázdného nebo stávajícího projektu webových formulářů

V tomto kurzu se dozvíte, jak do aplikace ASP.NET přidat ASP.NET Identity (nový systém členství pro ASP.NET).

Když vytvoříte nový projekt Web Forms nebo MVC v sadě Visual Studio 2017 RTM s individuálními účty, Visual Studio nainstaluje všechny požadované balíčky a přidá za vás všechny potřebné třídy. V tomto kurzu se dozvíte, jak přidat podporu ASP.NET Identity do existujícího projektu Web Forms nebo nového prázdného projektu. Nastíníme všechny balíčky NuGet, které potřebujete nainstalovat, a třídy, které musíte přidat. Projdeme si ukázkové Web Forms pro registraci nových uživatelů a přihlašování a zvýrazníme všechna hlavní rozhraní API vstupních bodů pro správu a ověřování uživatelů. Tato ukázka použije výchozí implementaci ASP.NET Identity pro úložiště dat SQL, která je založená na rozhraní Entity Framework. V tomto kurzu použijeme pro databázi SQL LocalDB.

Začínáme se službou ASP.NET Identity

  1. Začněte instalací a spuštěním sady Visual Studio 2017.

  2. Na úvodní stránce vyberte Nový projekt nebo můžete použít nabídku a vybrat Soubor a pak Nový projekt.

  3. V levém podokně rozbalte Visual C#, pak vyberte Web a pak ASP.NET Web Application (.Net Framework). Pojmenujte projekt WebFormsIdentity a vyberte OK.

    Obrázek znázorňující vytvoření nového projektu

  4. V dialogovém okně Nový projekt ASP.NET vyberte šablonu Prázdný .

    New A S P dot N E T project dialog window

    Všimněte si, že tlačítko Změnit ověřování je zakázané a tato šablona nepodporuje ověřování. Šablony Web Forms, MVC a webového rozhraní API umožňují vybrat přístup k ověřování.

Přidání balíčků identity do aplikace

V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet. Vyhledejte a nainstalujte balíček Microsoft.AspNet.Identity.EntityFramework .

Obrázek znázorňující přístup ke správě balíčků Nu Get

Všimněte si, že tento balíček nainstaluje balíčky závislostí : EntityFramework a Microsoft ASP.NET Identity Core.

Přidání webového formuláře pro registraci uživatelů

  1. V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Přidat a potom Webový formulář.

    Obrázek znázorňující, jak přidat webový formulář registrovaným uživatelům

  2. V dialogovém okně Zadejte název položky pojmenujte nový webový formulář Register a pak vyberte OK.

  3. Nahraďte kód ve vygenerovaném souboru Register.aspx následujícím kódem. Změny kódu jsou zvýrazněné.

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

    Poznámka

    Toto je zjednodušená verze souboru Register.aspx, která se vytvoří při vytváření nového ASP.NET Web Forms projektu. Výše uvedený kód přidá pole formuláře a tlačítko pro registraci nového uživatele.

  4. Otevřete soubor Register.aspx.cs a nahraďte obsah souboru následujícím kódem:

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

    Poznámka

    1. Výše uvedený kód je zjednodušená verze souboru Register.aspx.cs, která se vytvoří při vytvoření nového ASP.NET Web Forms projektu.
    2. Třída IdentityUser je výchozí EntityFramework implementace rozhraní IUser. Rozhraní IUser je minimální rozhraní pro uživatele v ASP.NET Identity Core.
    3. Třída UserStore je výchozí EntityFramework implementace úložiště uživatele. Tato třída implementuje minimální rozhraní ASP.NET Identity Core: IUserStore, IUserLoginStore, IUserClaimStore a IUserRoleStore.
    4. Třída UserManager zveřejňuje rozhraní API související s uživatelem, která automaticky uloží změny do UserStore.
    5. Třída IdentityResult představuje výsledek operace identity.
  5. V Průzkumník řešení klikněte pravým tlačítkem na projekt, vyberte Přidat, Přidat složku ASP.NET a pak App_Data.

    Obrázek přidání dat aplikace

  6. Otevřete souborWeb.config a přidejte položku připojovacího řetězce pro databázi, která bude používána k ukládání informací o uživateli. Databáze se vytvoří za běhu pomocí entity EntityFramework pro entity identity. Připojovací řetězec se podobá připojovacímu řetězci vytvořenému při vytváření nového Web Forms projektu. Zvýrazněný kód zobrazuje kód, který byste měli přidat:

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

    Poznámka

    V případě sady Visual Studio 2015 nebo novější nahraďte v připojovacím řetězci za (localdb)\v11.0(localdb)\MSSQLLocalDB .

  7. Klikněte pravým tlačítkem na soubor Register.aspx ve vašem projektu a vyberte Nastavit jako úvodní stránku. Stisknutím ctrl + F5 sestavte a spusťte webovou aplikaci. Zadejte nové uživatelské jméno a heslo a pak vyberte Zaregistrovat.

    Obrázek úspěšné registrace nového uživatele

    Poznámka

    ASP.NET Identity podporuje ověřování a v této ukázce můžete ověřit výchozí chování validátorů uživatelů a hesel, které pocházejí z balíčku Identity Core. Výchozí validátor uživatele (UserValidator) má vlastnost AllowOnlyAlphanumericUserNames , která má výchozí hodnotu nastavenou na true. Výchozí validátor hesla (MinimumLengthValidator) zajišťuje, aby heslo obsahovalo alespoň 6 znaků. Tyto validátory jsou vlastnosti UserManager , které se dají přepsat, pokud chcete mít vlastní ověřování.

Ověření databáze identity LocalDb a tabulek vygenerovaných rozhraním Entity Framework

  1. V nabídce Zobrazení vyberte Průzkumník serveru.

    Obrázek přístupu k Průzkumníku serveru

  2. Rozbalte DefaultConnection (WebFormsIdentity), rozbalte Tabulky, klikněte pravým tlačítkem na AspNetUsers a pak vyberte Zobrazit data tabulky.

    Obrázek, jak získat přístup k zobrazení dat tabulky
    Obrázek zobrazující data tabulky registrovaných uživatelů

Konfigurace aplikace pro ověřování OWIN

V tuto chvíli jsme přidali jenom podporu vytváření uživatelů. Teď si ukážeme, jak můžeme přidat ověřování pro přihlášení uživatele. ASP.NET Identity používá k ověřování pomocí formulářů middleware Microsoft OWIN Authentication. Ověřování souborů cookie OWIN je ověřovací mechanismus založený na souborech cookie a deklarací identity, který může používat jakákoli architektura hostovaná v OWIN nebo iis. S tímto modelem je možné používat stejné ověřovací balíčky v různých architekturách, včetně ASP.NET MVC a Web Forms. Další informace o projektu Katana a o tom, jak spustit middleware na hostiteli, najdete v tématu Začínáme s projektem Katana.

Instalace ověřovacích balíčků do aplikace

  1. V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet. Vyhledejte a nainstalujte balíček Microsoft.AspNet.Identity.Owin .

    Obrázek správce balíčků Nu Get

  2. Vyhledejte a nainstalujte balíček Microsoft.Owin.Host.SystemWeb .

    Poznámka

    Balíček Microsoft.Aspnet.Identity.Owin obsahuje sadu rozšiřujících tříd OWIN pro správu a konfiguraci middlewaru ověřování OWIN tak, aby ho využívaly balíčky ASP.NET Identity Core. Balíček Microsoft.Owin.Host.SystemWeb obsahuje server OWIN, který umožňuje spouštění aplikací založených na technologii OWIN ve službě IIS pomocí kanálu ASP.NET požadavků. Další informace najdete v tématu Middleware OWIN v integrovaném kanálu služby IIS.

Přidání tříd konfigurace spouštění A ověřování OWIN

  1. V Průzkumník řešení klikněte pravým tlačítkem na projekt, vyberte Přidat a potom Přidat novou položku. V dialogovém okně hledat text zadejte "owin". Pojmenujte třídu Startup a vyberte Přidat.

    Obrázek okna přidat novou položku

  2. V souboru Startup.cs přidejte níže uvedený zvýrazněný kód pro konfiguraci ověřování souborů cookie OWIN.

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

    Poznámka

    Tato třída obsahuje OwinStartup atribut pro určení spouštěcí třídy OWIN. Každá aplikace OWIN má spouštěcí třídu, ve které určíte komponenty pro kanál aplikace. Další informace o tomto modelu najdete v tématu Detekce spouštěcí třídy OWIN .

Přidání webových formulářů pro registraci a přihlašování uživatelů

  1. Otevřete soubor Register.aspx.cs a přidejte následující kód, který uživatele při úspěšné registraci přihlásí.

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

    Poznámka

    • Vzhledem k tomu, že ASP.NET Identity a Ověřování souborů cookie OWIN jsou systémem založeným na deklarací identity, rozhraní vyžaduje, aby vývojář aplikace vygeneroval identitu ClaimsIdentity pro uživatele. ClaimsIdentity obsahuje informace o všech deklarací identity pro uživatele, například o rolích, do nichž uživatel patří. V této fázi můžete pro uživatele také přidat další deklarace identity.
    • Uživatele můžete přihlásit pomocí správce AuthenticationManager z OWIN a volat SignIn a předat ClaimsIdentity, jak je znázorněno výše. Tento kód se přihlásí k uživateli a vygeneruje také soubor cookie. Toto volání je podobné formauthentication.SetAuthCookie používané modulem FormsAuthentication .
  2. V Průzkumník řešení klikněte pravým tlačítkem na projekt, vyberte Přidat a pak na Webový formulář. Webový formulář pojmenujte Přihlášení.

    Obrázek přidání nového webového formuláře

  3. Obsah souboru Login.aspx nahraďte následujícím kódem:

    <%@ 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. Obsah souboru Login.aspx.cs nahraďte následujícím kódem:

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

    Poznámka

    • Teď Page_Load zkontroluje stav aktuálního uživatele a na základě jeho Context.User.Identity.IsAuthenticated stavu provede akci. Zobrazit přihlášené uživatelské jméno : Rozhraní Microsoft ASP.NET Identity Framework přidalo metody rozšíření v System.Security.Principal.IIdentity , které umožňují získat UserName a UserId pro přihlášeného uživatele. Tyto rozšiřující metody jsou definovány Microsoft.AspNet.Identity.Core v sestavení. Tyto rozšiřující metody nahrazují HttpContext.User.Identity.Name .
    • Metoda SignIn: This Metoda nahradí předchozí CreateUser_Click metodu v této ukázce a po úspěšném vytvoření uživatele se nyní přihlásí k uživateli.
      Microsoft OWIN Framework přidal rozšiřující metody, System.Web.HttpContext které umožňují získat odkaz na IOwinContext. Tyto rozšiřující metody jsou definovány v Microsoft.Owin.Host.SystemWeb sestavení. Třída OwinContext zveřejňuje IAuthenticationManager vlastnost, která představuje funkci middlewaru ověřování, která je k dispozici v aktuální žádosti. Uživatele můžete přihlásit pomocí AuthenticationManager příkazu from OWIN a volat SignIn a předat ho ClaimsIdentity , jak je znázorněno výše. Vzhledem k tomu, že ASP.NET Identity a Ověřování souborů cookie OWIN jsou systémem založeným na deklaracích, rozhraní vyžaduje, aby aplikace vygenerovala ClaimsIdentity pro uživatele . Obsahuje ClaimsIdentity informace o všech deklaracích identity uživatele, například o rolích, ke kterým uživatel patří. V této fázi můžete také pro uživatele přidat další deklarace identity. Tento kód uživatele přihlásí a vygeneruje také soubor cookie. Toto volání je podobné formauthentication.SetAuthCookie používané modulem FormsAuthentication .
    • SignOut metoda: Získá odkaz z AuthenticationManager OWIN a zavolá SignOut. To je obdobou Metody FormsAuthentication.SignOut používané modulem FormsAuthentication .
  5. Stisknutím kombinace kláves Ctrl + F5 sestavte a spusťte webovou aplikaci. Zadejte nové uživatelské jméno a heslo a pak vyberte Zaregistrovat.

    Obrázek nové registrace usr
    Poznámka: V tomto okamžiku se vytvoří nový uživatel a přihlásí se.

  6. Vyberte tlačítko Odhlásit se . Budete přesměrováni na formulář Přihlášení.

  7. Zadejte neplatné uživatelské jméno nebo heslo a vyberte tlačítko Přihlásit se . Metoda UserManager.Find vrátí hodnotu null a zobrazí se chybová zpráva: " Neplatné uživatelské jméno nebo heslo ".

    Obrázek neplatného pokusu o přihlášení