Tin tức

Thiết kế web ASP.NET 4.5 - Kiểm tra và thanh toán với PayPal - phần 3

20/02/2013

Cho phép đăng nhập từ các trang web khác sử dụng OAuth và OpenID

Tiếp theo phần 2 của bài viết  thiết kế web ASP.NET 4.5 - Kiểm tra và thanh toán với PayPal.

ASP.NET Web Forms cung cấp các tùy chọn nâng cao cho các thành viên và xác thực. Những cải tiến này bao gồm trình cung cấp OAuth và OpenID mới. Sử dụng các trình cung cấp, bạn có thể cho phép người dùng đăng nhập vào trang web bạn bằng cách sử dụng các thông tin hiện có của họ từ Facebook, Twitter, Windows Live, và Google. Ví dụ, để đăng nhập vào bằng cách sử dụng một tài khoản Facebook, người dùng chỉ có thể chọn một lựa chọn Facebook, chuyển hướng đến trang đăng nhập Facebook, nơi nhập thông tin người dùng của họ. Sau đó, có thể kết hợp đăng nhập Facebook với tài khoản của họ trên trang web của bạn. Một cải tiến liên quan đến ASP.NET Web Forms với tính năng thành viên là người dùng có thể kết hợp các thông tin đăng nhập (bao gồm cả đăng nhập từ các trang web mạng xã hội) với một tài khoản duy nhất trên trang web của bạn.

Khi thêm một nhà cung cấp OAuth (Facebook, Twitter, hoặc Windows Live) cho ứng dụng ASP.NET Web Forms của bạn, bạn phải thiết lập giá trị ID ứng dụng (key) và giá trị bí mật ứng dụng. Bạn thêm các giá trị này vào tập tin AuthConfig.cs trong ứng dụng Web Forms. Ngoài ra, bạn phải tạo ra một ứng dụng trên các trang web bên ngoài (Facebook, Twitter, hoặc Windows Live). Khi tạo các ứng dụng trên các trang web bên ngoài, bạn có thể nhận được các khóa ứng dụng mà bạn sẽ cần để gọi tính năng đăng nhập cho các trang web này.

Lưu ý các ứng dụng Windows Live chỉ chấp nhận một URL trực tiếp cho một trang web làm việc, vì vậy bạn không thể sử dụng một URL của trang web cục bộ để kiểm tra thông tin đăng nhập.
Đối với các trang web có sử dụng một nhà cung cấp OpenID (Google), bạn không phải tạo một ứng dụng trên các trang web bên ngoài

1. Ở chế độ thiết kế web. Trong Solution Explorer, tìm và mở thư mục App_Start .
2. Mở tệp tên là AuthConfig.cs.
3. Bỏ ghi chú một dòng mã đơn để cho phép các tài khoản Google OpenID như dưới đây:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.Membership.OpenAuth;
 
namespace WingtipToys
{
    internal static class AuthConfig
    {
        public static void RegisterOpenAuth()
        {
            // See http://go.microsoft.com/fwlink/?LinkId=252803 for details on setting up this ASP.NET
            // application to support logging in via external services.
 
            //OpenAuth.AuthenticationClients.AddTwitter(
            //    consumerKey: "your Twitter consumer key",
            //    consumerSecret: "your Twitter consumer secret");
 
            //OpenAuth.AuthenticationClients.AddFacebook(
            //    appId: "your Facebook app id",
            //    appSecret: "your Facebook app secret");
 
            //OpenAuth.AuthenticationClients.AddMicrosoft(
            //    clientId: "your Microsoft account client id",
            //    clientSecret: "your Microsoft account client secret");
 
            OpenAuth.AuthenticationClients.AddGoogle();
        }
    }
}

4. Lưu tệp AuthConfig.cs.
Khi chạy ứng dụng mẫu Wingtip Toys, bạn sẽ có tùy chọn để đăng nhập vào tài khoản Google của mình và liên kết tài khoản Wingtip Toys của bạn với tài khoản Google.

Sửa chức năng đăng nhập

Như đã đề cập trong loạt bài hướng dẫn này, nhiều người sử dụng các chức năng đăng ký đã được bao gồm trong các mẫu ASP.NET Web Forms theo mặc định. Bây giờ bạn sẽ sửa đổi trang Login.aspx mặc định và trang Register.aspx gọi phương thức MigrateCart. Phương thức MigrateCart kết hợp người dùng nặc danh đăng mới được đăng nhập với giỏ mua hàng. Bằng cách kết hợp người sử dụng và giỏ hàng, ứng dụng mẫu Wingtip Toys sẽ có thể duy trì các giỏ mua hàng của người sử dụng giữa các lần truy cập.

5. Ở chế độ thiết kế web. Trong Solution Explorer, tìm và mở thư mục Account.
6. Mở trang Login.aspx.
7. Sửa điều khiển Login như dưới đây:
<asp:Login runat="server" ViewStateMode="Disabled" RenderOuterTable="false" ID="LoginCtrl" OnLoggedIn="LoginCtrl_LoggedIn">

8. Sửa code-behind của trang Login.aspx.cs để bao gồm mã được tô màu dưới đây:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
namespace WingtipToys.Account
{
    public partial class Login : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            RegisterHyperLink.NavigateUrl = "Register.aspx";
            OpenAuthLogin.ReturnUrl = Request.QueryString["ReturnUrl"];
 
            var returnUrl = HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"]);
            if (!String.IsNullOrEmpty(returnUrl))
            {
                RegisterHyperLink.NavigateUrl += "?ReturnUrl=" + returnUrl;
            }
        }
 
        protected void LoginCtrl_LoggedIn(object sender, EventArgs e)
        {
            WingtipToys.Logic.ShoppingCartActions usersShoppingCart = new WingtipToys.Logic.ShoppingCartActions();
            String cartId = usersShoppingCart.GetCartId();
            usersShoppingCart.MigrateCart(cartId, User.Identity.Name.ToString());
        }
    }
}
9. Lưu trang Login.aspxLogin.aspx.cs.
Bây giờ, bạn có thể bỏ qua cảnh báo không có định nghĩa cho phương thức MigrateCart. Bạn sẽ có thêm vào ở phần sau trong hướng dẫn này.
Điểu khiển Login hỗ trợ xử lý sự kiện OnLoggedIn. Bạn đã sửa mã đánh dấu của điều khiển Login trên trang Login.aspx bằng cách thêm thuộc tính OnLoggedIn. Khi một người dùng đã đăng nhập vào trang web bằng cách sử dụng điều khiển Login xong, sự kiện trong tệp Login.aspx.cs mà thuộc tính OnLoggedIn trỏ đến, LoginCtrl_LoggedIn, được kích hoạt.

Khi sự kiện LoginCtrl_LoggedIn xử lý mã lệnh bạn đã thêm vào Login.aspx.cs được gọi, một thể hiện mới của các giỏ hàng tên là usersShoppingCart được tạo ra. ID của các giỏ hàng (GUID) được lấy ra và gán cho biến cartId. Sau đó, phương thức MigrateCart được gọi, truyền cả cartId và tên của người sử dụng đăng nhập vào phương thức. Khi các giỏ hàng được chuyển, GUID được sử dụng để xác định giỏ mua hàng nặc danh được thay thế bằng tên người dùng.
Ngoài việc sửa đổi các trang Login.aspx để di chuyển các giỏ hàng khi người dùng đăng nhập, bạn cũng phải sửa đổi các trang Register.aspx để di chuyển các giỏ mua hàng khi người dùng tạo một tài khoản mới và đăng nhập.

10. Ở chế độ thiết kế web, trong thư mục Account , tệp code-behind tên là Register.aspx.cs.
11. Sửa tệp code-behind bằng cách bao gồm mã tô màu như dưới đây:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.AspNet.Membership.OpenAuth;
 
namespace WingtipToys.Account
{
    public partial class Register : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            RegisterUser.ContinueDestinationPageUrl = Request.QueryString["ReturnUrl"];
        }
 
        protected void RegisterUser_CreatedUser(object sender, EventArgs e)
        {
            FormsAuthentication.SetAuthCookie(RegisterUser.UserName, createPersistentCookie: false);
 
            WingtipToys.Logic.ShoppingCartActions usersShoppingCart = new WingtipToys.Logic.ShoppingCartActions();
            String cartId = usersShoppingCart.GetCartId();
            usersShoppingCart.MigrateCart(cartId, RegisterUser.UserName.ToString());
 
            string continueUrl = RegisterUser.ContinueDestinationPageUrl;
            if (!OpenAuth.IsLocalUrl(continueUrl))
            {
                continueUrl = "~/";
            }
            Response.Redirect(continueUrl);
        }
    }
}
12. Lưu tệp the Register.aspx.cs . Một lần nữa, bỏ qua các cảnh báo về phương thức MigrateCart. Chú ý rằng bạn đã sử mã trong xử lý sự kiện RegisterUser_CreatedUser giống như xử lý sự kiện LoginCtrl_LoggedIn. Khi người sử dụng đăng ký hoặc đăng nhập, một lời gọi đến phương thức MigrateCart sẽ được thực hiện.

Di chuyển giỏ hàng

Bây giờ đã đăng nhập và cập nhật quá trình đăng ký, bạn có thể thêm mã để di chuyển các giỏ hàng với phương thức MigrateCart
13. Ở chế độ thiết kế web, trong Solution Explorer, tìm thư mục và mở tệp ShoppingCartActions.cs.
14. Trong chế độ soạn thảo mã lệnh, thêm mã được tô màu dưới đây vào tệp ShoppingCartActions.cs, do vậy mã sẽ như sau:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WingtipToys.Models;
 
namespace WingtipToys.Logic
{
    public class ShoppingCartActions
    {
        public string ShoppingCartId { get; set; }
 
        private ProductContext _db = new ProductContext();
 
        public const string CartSessionKey = "CartId";
 
        public void AddToCart(int id)
        {
            // Retrieve the product from the database.          
            ShoppingCartId = GetCartId();
 
            var cartItem = _db.ShoppingCartItems.SingleOrDefault(
                c => c.CartId == ShoppingCartId
                && c.ProductId == id);
            if (cartItem == null)
            {
                // Create a new cart item if no cart item exists.                
                cartItem = new CartItem
                {
                    ItemId = Guid.NewGuid().ToString(),
                    ProductId = id,
                    CartId = ShoppingCartId,
                    Product = _db.Products.SingleOrDefault(
                     p => p.ProductID == id),
                    Quantity = 1,
                    DateCreated = DateTime.Now
                };
 
                _db.ShoppingCartItems.Add(cartItem);
            }
            else
            {
                // If the item does exist in the cart,                 
                // then add one to the quantity.                
                cartItem.Quantity++;
            }
            _db.SaveChanges();
        }
 
        public string GetCartId()
        {
            if (HttpContext.Current.Session[CartSessionKey] == null)
            {
                if (!string.IsNullOrWhiteSpace(HttpContext.Current.User.Identity.Name))
                {
                    HttpContext.Current.Session[CartSessionKey] = HttpContext.Current.User.Identity.Name;
                }
                else
                {
                    // Generate a new random GUID using System.Guid class.    
                    Guid tempCartId = Guid.NewGuid();
                    HttpContext.Current.Session[CartSessionKey] = tempCartId.ToString();
                }
            }
            return HttpContext.Current.Session[CartSessionKey].ToString();
        }
 
        public List<CartItem> GetCartItems()
        {
            ShoppingCartId = GetCartId();
 
            return _db.ShoppingCartItems.Where(
                c => c.CartId == ShoppingCartId).ToList();
        }
 
        public decimal GetTotal()
        {
            ShoppingCartId = GetCartId();
            // Multiply product price by quantity of that product to get       
            // the current price for each of those products in the cart. 
            // Sum all product price totals to get the cart total.  
            decimal? total = decimal.Zero;
            total = (decimal?)(from cartItems in _db.ShoppingCartItems
                               where cartItems.CartId == ShoppingCartId
                               select (int?)cartItems.Quantity *
                               cartItems.Product.UnitPrice).Sum();
            return total ?? decimal.Zero;
        }
 
        public ShoppingCartActions GetCart(HttpContext context)
        {
            var cart = new ShoppingCartActions();
            cart.ShoppingCartId = cart.GetCartId();
            return cart;
        }
 
        public void UpdateShoppingCartDatabase(String cartId, ShoppingCartUpdates[] CartItemUpdates)
        {
            using (var db = new WingtipToys.Models.ProductContext())
            {
                try
                {
                    int CartItemCount = CartItemUpdates.Count();
                    List<CartItem> myCart = GetCartItems();
                    foreach (var cartItem in myCart)
                    {
                        // Iterate through all rows within shopping cart list
                        for (int i = 0; i < CartItemCount; i++)
                        {
                            if (cartItem.Product.ProductID == CartItemUpdates[i].ProductId)
                            {
                                if (CartItemUpdates[i].PurchaseQuantity < 1 || CartItemUpdates[i].RemoveItem == true)
                                {
                                    RemoveItem(cartId, cartItem.ProductId);
                                }
                                else
                                {
                                    UpdateItem(cartId, cartItem.ProductId, CartItemUpdates[i].PurchaseQuantity);
                                }
                            }
                        }
                    }
                }
                catch (Exception exp)
                {
                    throw new Exception("ERROR: Unable to Update Cart Database - " + exp.Message.ToString(), exp);
                }
            }
        }
 
        public void RemoveItem(string removeCartID, int removeProductID)
        {
            using (var db = new WingtipToys.Models.ProductContext())
            {
                try
                {
                    var myItem = (from c in db.ShoppingCartItems where c.CartId == removeCartID && c.Product.ProductID == removeProductID select c).FirstOrDefault();
                    if (myItem != null)
                    {
                        // db.DeleteObject(myItem);
                        db.ShoppingCartItems.Remove(myItem);
                        db.SaveChanges();
                    }
                }
                catch (Exception exp)
                {
                    throw new Exception("ERROR: Unable to Remove Cart Item - " + exp.Message.ToString(), exp);
                }
            }
        }
 
        public void UpdateItem(string updateCartID, int updateProductID, int quantity)
        {
            //            using (webformsstorefrontEntities db = new webformsstorefrontEntities())
            using (var db = new WingtipToys.Models.ProductContext())
            {
                try
                {
                    var myItem = (from c in db.ShoppingCartItems where c.CartId == updateCartID && c.Product.ProductID == updateProductID select c).FirstOrDefault();
                    if (myItem != null)
                    {
                        myItem.Quantity = quantity;
                        db.SaveChanges();
                    }
                }
                catch (Exception exp)
                {
                    throw new Exception("ERROR: Unable to Update Cart Item - " + exp.Message.ToString(), exp);
                }
            }
        }
 
        public void EmptyCart()
        {
            ShoppingCartId = GetCartId();
            var cartItems = _db.ShoppingCartItems.Where(
                c => c.CartId == ShoppingCartId);
            foreach (var cartItem in cartItems)
            {
                _db.ShoppingCartItems.Remove(cartItem);
            }
            // Save changes.            
            _db.SaveChanges();
        }
 
        public int GetCount()
        {
            ShoppingCartId = GetCartId();
 
            // Get the count of each item in the cart and sum them up         
            int? count = (from cartItems in _db.ShoppingCartItems
                          where cartItems.CartId == ShoppingCartId
                          select (int?)cartItems.Quantity).Sum();
            // Return 0 if all entries are null        
            return count ?? 0;
        }
 
        public struct ShoppingCartUpdates
        {
            public int ProductId;
            public int PurchaseQuantity;
            public bool RemoveItem;
        }
 
        public void MigrateCart(string cartId, string userName)
        {
            var shoppingCart = _db.ShoppingCartItems.Where(c => c.CartId == cartId);
            foreach (CartItem item in shoppingCart)
            {
                item.CartId = userName;
            }
            HttpContext.Current.Session[CartSessionKey] = userName;
            _db.SaveChanges();
        }
    }
}
Phương thức MigrateCart sử dụng cartId hiện có để tìm giỏ hàng của người sử dụng. Tiếp theo, mã lặp qua tất cả các mục giỏ hàng và thay thế thuộc tính CartId (theo quy định bởi lược đồ CartItem) đã đăng nhập với tên người dùng

Cập nhật kết nối cơ sở dữ liệu
Nếu bạn đang theo hướng dẫn này bằng cách sử dụng các ứng dụng mẫu Wingtip Toys, bạn sẽ phải tạo cơ sở dữ liệu thành viên mặc định. Bằng cách thay đổi chuỗi kết nối mặc định, cơ sở dữ liệu thành viên sẽ được tạo ra trong lúc ứng dụng chạy.
15. Trong chế độ thiết kế web. Mở tệp Web.config ở thư mục gốc của dự án.
16. Cập nhật chuỗi kết nối ngầm định như sau:
<<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-WingtipToys;Integrated Security=True" providerName="System.Data.SqlClient" /><

Thiet ke web mien phi,  Hoc thiet ke web

ESVN- Nơi hội tụ giải pháp

Công ty cổ phần Eastern Sun Việt Nam