Boş veya Mevcut Bir Web Forms Projesine ASP.NET Identity Ekleme

Bu öğreticide, ASP.NET bir uygulamaya ASP.NET Kimliğin (ASP.NET için yeni üyelik sistemi) nasıl ekleneceği gösterilmektedir.

Tek Tek Hesaplarla Visual Studio 2017 RTM'de yeni bir Web Forms veya MVC projesi oluşturduğunuzda, Visual Studio gerekli tüm paketleri yükler ve sizin için tüm gerekli sınıfları ekler. Bu öğreticide, mevcut Web Forms projenize veya yeni bir boş projeye ASP.NET Kimlik desteği ekleme adımları gösterilir. Yüklemeniz gereken tüm NuGet paketlerini ve eklemeniz gereken sınıfları özetleyeceğim. Kullanıcı yönetimi ve kimlik doğrulaması için tüm ana giriş noktası API'lerini vurgularken yeni kullanıcıları kaydetmek ve oturum açmak için örnek Web Forms üzerinden geçiyorum. Bu örnek, Entity Framework üzerinde oluşturulan SQL veri depolaması için ASP.NET Kimliği varsayılan uygulamasını kullanır. Bu öğreticide SQL veritabanı için LocalDB kullanacağız.

ASP.NET Identity'i kullanmaya başlama

  1. Visual Studio 2017'yi yükleyip çalıştırarak başlayın.

  2. Başlangıç sayfasından Yeni Proje'yi seçin veya menüyü kullanıp Dosya'yı ve ardından Yeni Proje'yi seçebilirsiniz.

  3. Sol bölmede Visual C# öğesini genişletin, Web'i seçin ve ardından Web Uygulaması (.Net Framework) ASP.NET. Projenizi "WebFormsIdentity" olarak adlandırıp Tamam'ı seçin.

    Yeni proje oluşturma işlemini gösteren görüntü

  4. Yeni ASP.NET Projesi iletişim kutusunda Boş şablonu seçin.

    Yeni A S P nokta N E T projesi iletişim kutusu penceresi

    Kimlik Doğrulamasını Değiştir düğmesinin devre dışı olduğuna ve bu şablonda kimlik doğrulaması desteği sunulmadığını fark edin. Web Forms, MVC ve Web API şablonları kimlik doğrulama yaklaşımını seçmenize olanak sağlar.

Uygulamanıza Kimlik paketleri ekleme

Çözüm Gezgini'da projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Microsoft.AspNet.Identity.EntityFramework paketini arayın ve yükleyin.

Nu Get paketlerini yönetmeye erişmeyi gösteren görüntü

Bu paketin bağımlılık paketlerini yükleyeceğini unutmayın: EntityFramework ve Microsoft ASP.NET Identity Core.

Kullanıcıları kaydetmek için web formu ekleme

  1. Çözüm Gezgini'da projenize sağ tıklayın ve Ekle'yi ve ardından Web Formu'nu seçin.

    Kayıtlı kullanıcılara web formu eklemeyi gösteren resim

  2. Öğe için Ad Belirt iletişim kutusunda yeni web formunu Kaydet olarak adlandırın ve ardından Tamam'ı seçin

  3. Oluşturulan Register.aspx dosyasındaki işaretlemeyi aşağıdaki kodla değiştirin. Kod değişiklikleri vurgulanır.

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

    Not

    Bu, yeni bir ASP.NET Web Forms projesi oluşturduğunuzda oluşturulan Register.aspx dosyasının yalnızca basitleştirilmiş bir sürümüdür. Yukarıdaki işaretleme, yeni bir kullanıcıyı kaydetmek için form alanları ve bir düğme ekler.

  4. Register.aspx.cs dosyasını açın ve dosyanın içeriğini aşağıdaki kodla değiştirin:

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

    Not

    1. Yukarıdaki kod, yeni bir ASP.NET Web Forms projesi oluşturduğunuzda oluşturulan Register.aspx.cs dosyasının basitleştirilmiş bir sürümüdür.
    2. IdentityUser sınıfı, IUser arabiriminin varsayılan EntityFramework uygulamasıdır. IUser arabirimi, ASP.NET Identity Core'da bir kullanıcı için en düşük arabirimdir.
    3. UserStore sınıfı, bir kullanıcı deposunun varsayılan EntityFramework uygulamasıdır. Bu sınıf, ASP.NET Identity Core'un en düşük arabirimlerini uygular: IUserStore, IUserLoginStore, IUserClaimStore ve IUserRoleStore.
    4. UserManager sınıfı, değişiklikleri UserStore'na otomatik olarak kaydeden kullanıcıyla ilgili API'leri kullanıma sunar.
    5. IdentityResult sınıfı bir kimlik işleminin sonucunu temsil eder.
  5. Çözüm Gezgini'da projenize sağ tıklayın ve Ekle, ASP.NET Klasör Ekle'yi seçin ve App_Data.

    Uygulama verilerinin nasıl ekleneceğini gösteren çizim

  6. Web.config dosyasını açın ve kullanıcı bilgilerini depolamak için kullanacağımız veritabanı için bir bağlantı dizesi girdisi ekleyin. Veritabanı, Identity varlıkları için EntityFramework tarafından çalışma zamanında oluşturulur. Bağlantı dizesi, yeni bir Web Forms projesi oluşturduğunuzda sizin için oluşturulan dizeye benzer. Vurgulanan kod, eklemeniz gereken işaretlemeyi gösterir:

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

    Not

    Visual Studio 2015 veya üzeri için bağlantı dizenizde öğesini ile (localdb)\MSSQLLocalDB değiştirin(localdb)\v11.0.

  7. Projenizde Register.aspx dosyasına sağ tıklayın ve Başlangıç Sayfası Olarak Ayarla'yı seçin. Web uygulamasını derlemek ve çalıştırmak için Ctrl + F5 tuşlarına basın. Yeni bir kullanıcı adı ve parola girip Kaydet'i seçin.

    Görüntü başarılı yeni kullanıcı kaydı

    Not

    ASP.NET Identity'in doğrulama desteği vardır ve bu örnekte, Identity Core paketinden gelen Kullanıcı ve Parola doğrulayıcılarında varsayılan davranışı doğrulayabilirsiniz. Kullanıcı (UserValidator) için varsayılan doğrulayıcı, varsayılan değeri olarak ayarlanmış truebir özelliğe AllowOnlyAlphanumericUserNames sahiptir. Parola (MinimumLengthValidator) için varsayılan doğrulayıcı, parolanın en az 6 karakter olmasını sağlar. Bu doğrulayıcılar, özel doğrulamaya sahip olmak istiyorsanız geçersiz kılınabilecek özelliklerdir UserManager .

Entity Framework tarafından oluşturulan LocalDb Identity veritabanını ve tablolarını doğrulama

  1. Görünüm menüsünde Sunucu Gezgini'ni seçin.

    Sunucu gezginine erişme görüntüsü

  2. DefaultConnection (WebFormsIdentity) seçeneğini genişletin, Tablolar'ı genişletin, AspNetUsers'a sağ tıklayın ve Tablo Verilerini Göster'i seçin.

    Tablo verilerini göster'e erişmenin resmi
    Kayıtlı kullanıcıların tablo verilerini gösteren görüntü

Uygulamayı OWIN kimlik doğrulaması için yapılandırma

Bu noktada yalnızca kullanıcı oluşturma desteği ekledik. Şimdi, bir kullanıcının oturum açması için kimlik doğrulamasını nasıl ekleyebileceğimizi göstereceğiz. ASP.NET Identity, form kimlik doğrulaması için Microsoft OWIN Kimlik Doğrulaması ara yazılımını kullanır. OWIN Tanımlama Bilgisi Kimlik Doğrulaması, OWIN veya IIS üzerinde barındırılan herhangi bir çerçeve tarafından kullanılabilecek tanımlama bilgisi ve talep tabanlı bir kimlik doğrulama mekanizmasıdır. Bu modelle, aynı kimlik doğrulama paketleri ASP.NET MVC ve Web Forms dahil olmak üzere birden çok çerçevede kullanılabilir. Katana projesi ve konakta ara yazılımı çalıştırma hakkında daha fazla bilgi için bkz. Katana Projesi ile Çalışmaya Başlama.

Uygulamanıza kimlik doğrulama paketleri yükleme

  1. Çözüm Gezgini'da projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Microsoft.AspNet.Identity.Owin paketini arayın ve yükleyin.

    Nu Get paket yöneticisinin görüntüsü

  2. Microsoft.Owin.Host.SystemWeb paketini arayın ve yükleyin.

    Not

    Microsoft.Aspnet.Identity.Owin paketi, ASP.NET Identity Core paketleri tarafından kullanılacak OWIN kimlik doğrulama ara yazılımını yönetmek ve yapılandırmak için bir dizi OWIN uzantı sınıfı içerir. Microsoft.Owin.Host.SystemWeb paketi, OWIN tabanlı uygulamaların ASP.NET istek işlem hattını kullanarak IIS üzerinde çalışmasını sağlayan bir OWIN sunucusu içerir. Daha fazla bilgi için bkz. IIS tümleşik işlem hattında OWIN Ara Yazılımı.

OWIN başlatma ve kimlik doğrulaması yapılandırma sınıfları ekleme

  1. Çözüm Gezgini'da projenize sağ tıklayın, Ekle'yi ve ardından Yeni Öğe Ekle'yi seçin. Arama metin kutusu iletişim kutusuna "owin" yazın. Sınıfı "Başlangıç" olarak adlandırın ve Ekle'yi seçin.

    Yeni öğe ekle penceresinin resmi

  2. Startup.cs dosyasında, OWIN tanımlama bilgisi kimlik doğrulamasını yapılandırmak için aşağıda gösterilen vurgulanan kodu ekleyin.

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

    Not

    Bu sınıf, OWIN başlangıç sınıfını belirtme özniteliğini içerir OwinStartup . Her OWIN uygulamasının, uygulama işlem hattı için bileşenleri belirttiğiniz bir başlangıç sınıfı vardır. Bu model hakkında daha fazla bilgi için bkz. OWIN Başlangıç Sınıfı Algılama .

Kullanıcıları kaydetmek ve oturum açmak için web formları ekleme

  1. Register.aspx.cs dosyasını açın ve kayıt başarılı olduğunda kullanıcıda oturum açan aşağıdaki kodu ekleyin.

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

    Not

    • ASP.NET Kimliği ve OWIN Tanımlama Bilgisi Kimlik Doğrulaması talep tabanlı sistem olduğundan, çerçeve uygulama geliştiricisinin kullanıcı için bir ClaimsIdentity oluşturmasını gerektirir. ClaimsIdentity, kullanıcının ait olduğu Roller gibi kullanıcı için tüm talepler hakkında bilgi içerir. Bu aşamada kullanıcı için daha fazla talep de ekleyebilirsiniz.
    • OWIN'den AuthenticationManager'ı kullanarak ve yukarıda gösterildiği gibi ClaimsIdentity öğesini çağırarak SignIn ve geçirerek kullanıcıda oturum açabilirsiniz. Bu kod, kullanıcıda oturum açar ve bir tanımlama bilgisi de oluşturur. Bu çağrı, FormsAuthentication modülü tarafından kullanılan FormAuthentication.SetAuthCookie ile benzerdir.
  2. Çözüm Gezgini'da projenize sağ tıklayın, Ekle'yi ve ardından Web Formu'nu seçin. Web formunu Login olarak adlandırın.

    Yeni web formu ekleme resmi

  3. Login.aspx dosyasının içeriğini aşağıdaki kodla değiştirin:

    <%@ 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. Login.aspx.cs dosyasının içeriğini aşağıdakilerle değiştirin:

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

    Not

    • şimdi Page_Load geçerli kullanıcının durumunu denetler ve durumuna göre Context.User.Identity.IsAuthenticated eylem gerçekleştirir. Oturum Açmış Kullanıcı Adını Görüntüle: Microsoft ASP.NET Identity Framework, oturum açmış kullanıcının ve UserId değerlerini almanıza UserName olanak tanıyan System.Security.Principal.IIdentity uzantısı yöntemleri eklemiştir. Bu uzantı yöntemleri derlemede Microsoft.AspNet.Identity.Core tanımlanır. Bu uzantı yöntemleri , HttpContext.User.Identity.Name yerine geçer.
    • SignIn yöntemi: This yöntem, bu örnekteki önceki CreateUser_Click yöntemin yerini alır ve şimdi kullanıcı başarıyla oluşturulduktan sonra kullanıcıda oturum açar.
      Microsoft OWIN Framework, öğesine System.Web.HttpContext başvuru IOwinContextalmanıza olanak tanıyan uzantı yöntemleri eklemiştir. Bu uzantı yöntemleri derlemede Microsoft.Owin.Host.SystemWeb tanımlanır. sınıfı, OwinContext geçerli istekte kullanılabilen Kimlik Doğrulama ara yazılım işlevselliğini temsil eden bir IAuthenticationManager özelliği kullanıma sunar. OWIN'den komutunu kullanarak AuthenticationManager ve yukarıda gösterildiği gibi öğesini çağırarak SignIn ve geçirerek kullanıcıda ClaimsIdentity oturum açabilirsiniz. ASP.NET Kimliği ve OWIN Tanımlama Bilgisi Kimlik Doğrulaması talep tabanlı sistem olduğundan, çerçeve uygulamanın kullanıcı için bir ClaimsIdentity oluşturmasını gerektirir. , ClaimsIdentity kullanıcının hangi rollere ait olduğu gibi kullanıcı için tüm talepler hakkında bilgi içerir. Bu aşamada kullanıcı için daha fazla talep de ekleyebilirsiniz. Bu kod, kullanıcıda oturum açar ve bir tanımlama bilgisi de oluşturur. Bu çağrı, FormsAuthentication modülü tarafından kullanılan FormAuthentication.SetAuthCookie ile benzerdir.
    • SignOut method: OWIN'den öğesine AuthenticationManager bir başvuru alır ve öğesini çağırır SignOut. Bu, FormsAuthentication modülü tarafından kullanılan FormsAuthentication.SignOut yöntemine benzer.
  5. Web uygulamasını derlemek ve çalıştırmak için Ctrl + F5 tuşlarına basın. Yeni bir kullanıcı adı ve parola girip Kaydet'i seçin.

    Yeni usr kaydının görüntüsü
    Not: Bu noktada, yeni kullanıcı oluşturulur ve oturum açar.

  6. Oturumu kapat düğmesini seçin. Oturum açma formuna yönlendirilirsiniz.

  7. Geçersiz bir kullanıcı adı veya parola girin ve Oturum aç düğmesini seçin. Yöntem UserManager.Find null döndürür ve " Geçersiz kullanıcı adı veya parola " hata iletisi görüntülenir.

    Geçersiz oturum açma girişiminin görüntüsü