Bölüm 6: ASP.NET Üyeliği

tarafından Joe Stagner

Not

Bu makale yazıldığından beri, ASP.NET Üyelik sağlayıcılarının yerini ASP.NET Identity alır. Bu makalenin yazıldığı sırada öne çıkan Üyelik sağlayıcıları yerine ASP.NET Kimlik platformunu kullanmak için uygulamaları güncelleştirmenizi kesinlikle öneririz. ASP.NET Identity, ASP.NET Üyelik sistemine göre aşağıdakiler dahil olmak üzere çeşitli avantajlara sahiptir:

  • Daha iyi performans
  • Geliştirilmiş genişletilebilirlik ve test edilebilirlik
  • OAuth, OpenID Connect ve iki öğeli kimlik doğrulaması desteği
  • Talep Tabanlı Kimlik desteği
  • ASP.Net Core ile daha iyi birlikte çalışabilirlik

Tailspin Spyworks, .NET platformu için güçlü, ölçeklenebilir uygulamalar oluşturmanın ne kadar basit olduğunu gösterir. Alışveriş, ödeme ve yönetim gibi çevrimiçi bir mağaza oluşturmak için ASP.NET 4'teki harika yeni özelliklerin nasıl kullanılacağını gösterir.

Bu öğretici serisi, Tailspin Spyworks örnek uygulamasını derlemek için atılan tüm adımların ayrıntılarını içerir. 6. Bölüm, ASP.NET Üyeliği ekler.

ASP.NET Üyeliğiyle Çalışma

S P nokta NET Yapılandırması'nın nerede seçildiğini gösteren ekran görüntüsü.

Güvenlik'e tıklayın

Güvenlik'e nerede tıklandığını gösteren ekran görüntüsü.

Form kimlik doğrulaması kullandığınızdan emin olun.

Form kimlik doğrulaması kullandığınızı onaylamayı gösteren ekran görüntüsü.

Birkaç kullanıcı oluşturmak için "Kullanıcı Oluştur" bağlantısını kullanın.

Kullanıcı Oluştur'a nerede tıklandığını gösteren ekran görüntüsü.

İşiniz bittiğinde Çözüm Gezgini penceresine bakın ve görünümü yenileyin.

Görünümün nerede yenilendiğini gösteren ekran görüntüsü.

ASPNETDB'nin. MDF fine oluşturuldu. Bu dosya, üyelik gibi temel ASP.NET hizmetlerini destekleyecek tabloları içerir.

Artık kullanıma alma işlemini uygulamaya başlayabiliriz.

Bir CheckOut.aspx sayfası oluşturarak başlayın.

CheckOut.aspx sayfası yalnızca oturum açmış olan kullanıcılar tarafından kullanılabilir olmalıdır, bu nedenle oturum açmış olan kullanıcılara erişimi kısıtlar ve LogIn sayfasında oturum açmamış kullanıcıları yeniden yönlendiririz.

Bunu yapmak için web.config dosyamızın yapılandırma bölümüne aşağıdakileri ekleyeceğiz.

<location path="Checkout.aspx">
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
  </location>

ASP.NET Web Forms uygulamaları için şablon, web.config dosyamıza otomatik olarak bir kimlik doğrulama bölümü ekledi ve varsayılan oturum açma sayfasını oluşturdu.

<authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>

Kullanıcı oturum açtığında anonim alışveriş sepetini geçirmek için dosyanın arkasındaki Login.aspx kodunu değiştirmeliyiz. Page_Load olayını aşağıdaki gibi değiştirin.

using System.Web.Security;

protected void Page_Load(object sender, EventArgs e)
{
  // If the user is not submitting their credentials
  // save refferer
  if (!Page.IsPostBack)
     {
     if (Page.Request.UrlReferrer != null)
        {
        Session["LoginReferrer"] = Page.Request.UrlReferrer.ToString();
        }
      }
           
  // User is logged in so log them out.
  if (User.Identity.IsAuthenticated)
     {
     FormsAuthentication.SignOut();
     Response.Redirect("~/");
     }
}

Ardından oturum adını yeni oturum açmış kullanıcıya ayarlamak ve MyShoppingCart sınıfımızda MigrateCart yöntemini çağırarak alışveriş sepetindeki geçici oturum kimliğini kullanıcınınkiyle değiştirmek için bunun gibi bir "LoggedIn" olay işleyicisi ekleyin. (.cs dosyasında uygulanır)

protected void LoginUser_LoggedIn(object sender, EventArgs e)
{
  MyShoppingCart usersShoppingCart = new MyShoppingCart();
  String cartId = usersShoppingCart.GetShoppingCartId();
  usersShoppingCart.MigrateCart(cartId, LoginUser.UserName);
            
  if(Session["LoginReferrer"] != null)
    {
    Response.Redirect(Session["LoginReferrer"].ToString());
    }

  Session["UserName"] = LoginUser.UserName;
}

MigrateCart() yöntemini aşağıdaki gibi uygulayın.

//--------------------------------------------------------------------------------------+
public void MigrateCart(String oldCartId, String UserName)
{
  using (CommerceEntities db = new CommerceEntities())
    {
    try
      {
      var myShoppingCart = from cart in db.ShoppingCarts
                           where cart.CartID == oldCartId
                           select cart;

      foreach (ShoppingCart item in myShoppingCart)
        {
        item.CartID = UserName;                 
        }
      db.SaveChanges();
      Session[CartId] = UserName;
      }
    catch (Exception exp)
      {
      throw new Exception("ERROR: Unable to Migrate Shopping Cart - " +     
                           exp.Message.ToString(), exp);
      }
    }           
}

Checkout.aspx'da, alışveriş sepeti sayfamızda yaptığımız gibi, kullanıma alma sayfamızda bir EntityDataSource ve GridView kullanacağız.

<div id="CheckOutHeader" runat="server" class="ContentHead">
  Review and Submit Your Order
</div>
<span id="Message" runat="server"><br />     
   <asp:Label ID="LabelCartHeader" runat="server" 
              Text="Please check all the information below to be sure it&#39;s correct.">
   </asp:Label>
</span><br /> 
<asp:GridView ID="MyList" runat="server" AutoGenerateColumns="False" 
              DataKeyNames="ProductID,UnitCost,Quantity" 
              DataSourceID="EDS_Cart" 
              CellPadding="4" GridLines="Vertical" CssClass="CartListItem" 
              onrowdatabound="MyList_RowDataBound" ShowFooter="True">
  <AlternatingRowStyle CssClass="CartListItemAlt" />
  <Columns>
    <asp:BoundField DataField="ProductID" HeaderText="Product ID" ReadOnly="True" 
                    SortExpression="ProductID"  />
    <asp:BoundField DataField="ModelNumber" HeaderText="Model Number" 
                    SortExpression="ModelNumber" />
    <asp:BoundField DataField="ModelName" HeaderText="Model Name" 
                    SortExpression="ModelName" />
    <asp:BoundField DataField="UnitCost" HeaderText="Unit Cost" ReadOnly="True" 
                    SortExpression="UnitCost" DataFormatString="{0:c}" />
    <asp:BoundField DataField="Quantity" HeaderText="Quantity" ReadOnly="True" 
                    SortExpression="Quantity" />
    <asp:TemplateField> 
      <HeaderTemplate>Item Total</HeaderTemplate>
      <ItemTemplate>
        <%# (Convert.ToDouble(Eval("Quantity")) * Convert.ToDouble(Eval("UnitCost")))%>
      </ItemTemplate>
    </asp:TemplateField>
  </Columns>
  <FooterStyle CssClass="CartListFooter"/>
  <HeaderStyle  CssClass="CartListHead" />
</asp:GridView>   
    
<br />
<asp:imagebutton id="CheckoutBtn" runat="server" ImageURL="Styles/Images/submit.gif" 
                                  onclick="CheckoutBtn_Click">
</asp:imagebutton>
<asp:EntityDataSource ID="EDS_Cart" runat="server" 
                      ConnectionString="name=CommerceEntities" 
                      DefaultContainerName="CommerceEntities" 
                      EnableFlattening="False" 
                      EnableUpdate="True" 
                      EntitySetName="ViewCarts" 
                      AutoGenerateWhereClause="True" 
                      EntityTypeFilter="" 
                      Select="" Where="">
   <WhereParameters>
      <asp:SessionParameter Name="CartID" DefaultValue="0" 
                                          SessionField="TailSpinSpyWorks_CartID" />
   </WhereParameters>
</asp:EntityDataSource>

GridView denetimimizin MyList_RowDataBound adlı bir "ondatabound" olay işleyicisi belirttiğini unutmayın, bu nedenle bu olay işleyicisini şöyle uygulayalım.

decimal _CartTotal = 0;

//--------------------------------------------------------------------------------------+
protected void MyList_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
     {
     TailspinSpyworks.Data_Access.ViewCart myCart = new Data_Access.ViewCart();
     myCart = (TailspinSpyworks.Data_Access.ViewCart)e.Row.DataItem;
     _CartTotal += myCart.UnitCost * myCart.Quantity;
     }
   else if (e.Row.RowType == DataControlRowType.Footer)
     {
     if (_CartTotal > 0)
        {
        CheckOutHeader.InnerText = "Review and Submit Your Order";
        LabelCartHeader.Text = "Please check all the information below to be sure
                                                                it&#39;s correct.";
        CheckoutBtn.Visible = true;
        e.Row.Cells[5].Text = "Total: " + _CartTotal.ToString("C");
        }
     }
}

Bu yöntem, her satır bağlı olduğundan alışveriş sepetinin toplamını tutar ve GridView'un alt satırını güncelleştirir.

Bu aşamada, yapılacak siparişin "gözden geçirme" sunumunu uyguladık.

Şimdi Page_Load olayımıza birkaç satır kod ekleyerek boş bir sepet senaryomuzu ele alalım:

protected void Page_Load(object sender, EventArgs e)
{
   CheckOutHeader.InnerText = "Your Shopping Cart is Empty";
   LabelCartHeader.Text = "";
   CheckoutBtn.Visible = false;
}

Kullanıcı "Gönder" düğmesine tıkladığında Gönder Düğmesi Tıklama Olay işleyicisinde aşağıdaki kodu yürüteceğiz.

protected void CheckoutBtn_Click(object sender, ImageClickEventArgs e)
{
  MyShoppingCart usersShoppingCart = new MyShoppingCart();
  if (usersShoppingCart.SubmitOrder(User.Identity.Name) == true)
    {
    CheckOutHeader.InnerText = "Thank You - Your Order is Complete.";
    Message.Visible = false;
    CheckoutBtn.Visible = false;
    }
  else
    {
    CheckOutHeader.InnerText = "Order Submission Failed - Please try again. ";
    }
}

Sipariş gönderim işleminin "et"i MyShoppingCart sınıfımızın SubmitOrder() yönteminde uygulanacaktır.

SubmitOrder:

  • Alışveriş sepetindeki tüm satır öğelerini alın ve bunları kullanarak yeni bir Sipariş Kaydı ve ilişkili OrderDetails kayıtları oluşturun.
  • Sevkiyat Tarihini Hesapla'yı seçin.
  • Alışveriş sepetini temizleyin.
//--------------------------------------------------------------------------------------+
public bool SubmitOrder(string UserName)
{
  using (CommerceEntities db = new CommerceEntities())
    {
    try
      {
      //------------------------------------------------------------------------+
      //  Add New Order Record                                                  |
      //------------------------------------------------------------------------+
      Order newOrder = new Order();
      newOrder.CustomerName = UserName;
      newOrder.OrderDate = DateTime.Now;
      newOrder.ShipDate = CalculateShipDate();
      db.Orders.AddObject(newOrder);
      db.SaveChanges();
         
      //------------------------------------------------------------------------+
      //  Create a new OderDetail Record for each item in the Shopping Cart     |
      //------------------------------------------------------------------------+
      String cartId = GetShoppingCartId();
      var myCart = (from c in db.ViewCarts where c.CartID == cartId select c);
      foreach (ViewCart item in myCart)
        {
        int i = 0;
        if (i < 1)
          {
          OrderDetail od = new OrderDetail();
          od.OrderID = newOrder.OrderID;
          od.ProductID = item.ProductID;
          od.Quantity = item.Quantity;
          od.UnitCost = item.UnitCost;
          db.OrderDetails.AddObject(od);
          i++;
          }

        var myItem = (from c in db.ShoppingCarts where c.CartID == item.CartID && 
                         c.ProductID == item.ProductID select c).FirstOrDefault();
        if (myItem != null)
          {
          db.DeleteObject(myItem);
          }
        }
      db.SaveChanges();                    
      }
    catch (Exception exp)
      {
      throw new Exception("ERROR: Unable to Submit Order - " + exp.Message.ToString(), 
                                                               exp);
      }
    } 
  return(true);
}

Bu örnek uygulamanın amaçları doğrultusunda, geçerli tarihe yalnızca iki gün ekleyerek bir sevk tarihini hesaplayacağız.

//--------------------------------------------------------------------------------------+
DateTime CalculateShipDate()
{
   DateTime shipDate = DateTime.Now.AddDays(2);
   return (shipDate);
}

Uygulamayı şimdi çalıştırmak, alışveriş sürecini baştan sona test etmemize izin verir.