成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET安全認證機制基于角色窗體的實現

開發 后端
本文試圖通過一些例子來說明如何實現基于角色窗體的ASP.NET安全認證機制,展示ASP.NET中窗體認證強大的功能特性。

簡介:

ASP.NET 中窗體認證是一個功能非常強大的特性,只需要很少的代碼就可以實現一個簡單的平臺無關的ASP.NET安全認證機制。 但是,如果你需要一個更復雜更有效的認證機制,那么你就要把眾多用戶分成用戶群組,以利用它的靈活性。

Windows 集成認證提供了這種認證機制,但它使用的是 NTLM,即Windows NT LAN Manager,因而它不是跨平臺的。現在越來越多的人使用 Linux 系統,而 Mozilla Forefox 瀏覽器用戶也越來越多,我們肯定不能把這些人拒之門外,因此我們尋求另外的ASP.NET安全認證機制。有兩個選擇:

一是為網站劃分多個區域,提供多個登錄頁面,強迫用戶一個一個的去注冊和登錄;

二是把用戶分組,并且限制特定用戶組對某頁面或者某區域訪問的權限。

后者當然是更好的選擇。通過分配角色給各個用戶,我們能夠實現這種功能。

微軟為.NET平臺留下了窗體認證中基于角色的認證機制,但是我們必須自己去實現它。本文力求覆蓋窗體認證中基于角色的認證機制的一些基本的東西,比如它的概念,它的實現,如何在Web應用程序中應用等。

必要準備:

我們首先要建立一個數據庫,一個Web應用項目,幾個不同安全級別的機密目錄,以及幾個ASP.NET頁面。當然你也可以在你現有的Web應用項目中添加這些。

1、創建數據庫

首先要選擇你需要使用的數據庫管理系統 DBMS。本文使用 SQL Server 2000。

在實際應用項目的數據庫中,一般都會有用戶數據表 Users,它可能包括用戶唯一標記:UserID,用戶名:UserName,密碼:Password,用戶的郵件地址:Email,用戶所在城市:City,用戶登錄次數 LoginCount 等。可以通過創建一個 UserInRoles 數據表(一般可以包括兩個字段,用戶名:UserName,用戶角色:UserRoles)來實現為用戶分配角色。

為了簡單,我只創建一個 Users 數據表,它有3個字段,用戶名 UserName,密碼 Password,用戶角色 UserRoles。創建表之前,你要選擇數據庫,或者創建一個新的數據庫。要創建一個新的命名為WebSolution的數據庫 ,只需要簡單的SQL語句:

  1. Create DATABASE WebSolution  
  2. GO   
  3. 要選擇一個叫msdb的數據庫,可以使用SQL語句:   
  4. USE msdb  
  5. GO   
  6. 接下來,我們創建剛才提到的 Users 數據表,  
  7. SQL 腳本如下:  
  8. Create TABLE Users  
  9. (  
  10. UserName nvarchar(100) CONSTRAINT   
  11. PK_UserName PRIMARY KEY,  
  12. Password nvarchar(150),  
  13. UserRoles nvarchar(100)  
  14. )   
  15. 可以為這個表創建索引 Credentials,SQL語句如下:  
  16. Create INDEX Credentials ON Users  
  17. (  
  18. UserName,  
  19. Password 
  20. )   

是否創建索引是可選的,由你自己決定。索引的好處和壞處請參考相關資料。

然后我們為這個Users數據庫添加數據。角色名稱由你自己自由選擇,但是最好用有意義的名稱,

比如"Administrator"(頂級管理員),"Manager"(管理員),"Member"(加盟成員),"User"(普通用戶)等。

例如:

  1. UserName|Password|Roles  
  2. "willmove"|"pwd123"|"Administrator,User" 
  3. "amuhouse"|"pwd123"|"User"   
  4. 其SQL語句是:   
  5. --注意 '45CB41B32DCFB917CCD8614F1536D6DA'   
  6. 是 'pwd123' 使用 md5 加密后的字符串   
  7. Insert INTO Users(UserName,Password,UserRoles)   
  8. VALUES ('willmove','45CB41B32DCFB917CCD8614F1536D6DA' 
  9. ,'Administrator,User')  
  10. GO  
  11. Insert INTO Users(UserName,Password,UserRoles)   
  12. VALUES ('amuhouse','45CB41B32DCFB917CCD8614F1536D6DA' 
  13. ,'User')  
  14. GO   

要注意的是角色 Roles 是大小寫敏感的,這是因為在 Web.config 文件中是大小寫敏感的。現在我們為實現這個安全認證機制創建幾個必要的頁面。

首先是用戶登錄頁面 Login.aspx

如果還沒有創建Web應用程序,那就現在創建一個。當然你也可以在一個已有的Web應用程序中創建這個頁面。這里我假設已經創建了一個名稱為 RolebasedAuth的Web應用程序(即 Visual Studio .Net 中的Project)。我把這個Login.aspx放在它的根目錄下,也就是通過 http://localhost/RolebasedAuth/Login.aspx 可以訪問。這個Login.aspx放在哪里是無所謂的,但是在ASP.NET安全認證機制中它必須是公眾有權限訪問的。

  #p# 

在應用程序根路徑下,我們創建兩個機密的子目錄,分別是 Admin 和 User。

接下來,我們創建一個支持角色認證的窗體的基于ASP.NET安全認證機制的登錄系統。因為微軟沒有提供簡單的實現機制,我們要自己花些時間去創建認證票據。它需要存貯少量信息,當然,有些名稱必須和 Web.config 中配置的一樣,要不ASP.NET 就會認為你的認證票據是無效的,從而強制轉向到登錄頁面。我們在 VS.NET 中為 Login.aspx 添加兩個TextBox控件,取名 UserNameTextBox, PasswordTextBox,再添加一個Button,取名 LoginButton,點擊它進入后臺代碼。

在 LoginButton_Click 方法中添加需要的代碼。如下:

  1. private void LoginButton_Click  
  2. (object sender, System.EventArgs e)  
  3.  
  4. {  
  5. // 初始化   
  6. FormsAuthentication  
  7. // 注意它是在   
  8. System.Web.Security 命名空間  
  9. // 因此要在代碼開始添加   
  10. using System.Web.Security;  
  11. FormsAuthentication.Initialize ();   
  12.  
  13. // 創建數據庫連接和數據庫操作命令對象  
  14. // 注意它是在   
  15. System.Data.SqlClient 命名空間  
  16. // 因此要在代碼開始處添加   
  17. using System.Data.SqlClient;  
  18. SqlConnection conn =  
  19. new SqlConnection("Data   
  20. Source=sun-willmove;integrated   
  21. security=SSPI;  
  22. Initial Catalog=WebSolution;");   
  23. SqlCommand cmd = conn.CreateCommand();  
  24. cmd.CommandText = "Select UserRoles   
  25. FROM Users Where UserName=@username " +  
  26. "AND Password=@password";  
  27. // 填充各個參數   
  28. cmd.Parameters.Add("@username",   
  29. SqlDbType.NVarChar, 100).Value =  
  30. UserNameTextBox.Text;  
  31. cmd.Parameters.Add("@password",   
  32. SqlDbType.NVarChar, 150).Value =   
  33. FormsAuthentication.  
  34. HashPasswordForStoringInConfigFile(  
  35. PasswordTextBox.Text, "md5");  
  36.  // 或者 "sha1" 
  37.  
  38. // 執行數據庫操作命令  
  39. conn.Open();  
  40. SqlDataReader reader = cmd.ExecuteReader();  
  41. if (reader.Read())  
  42. {  
  43. // 為了實現認證,創建一個新的票據  
  44. FormsAuthenticationTicket ticket = new   
  45. FormsAuthenticationTicket(   
  46. 1, // 票據版本號  
  47. UserNameTextBox.Text, // 票據持有者  
  48. DateTime.Now, //分配票據的時間  
  49. DateTime.Now.AddMinutes(30), // 失效時間  
  50. true, // 需要用戶的 cookie   
  51. reader.GetString(0), // 用戶數據,  
  52. 這里其實就是用戶的角色  
  53. FormsAuthentication.FormsCookiePath);  
  54. //cookie有效路徑   
  55.  
  56. //使用機器碼machine key加密cookie,  
  57. 為了安全傳送  
  58. string hash = FormsAuthentication.  
  59. Encrypt(ticket);  
  60. HttpCookie cookie = new HttpCookie(  
  61. FormsAuthentication.FormsCookieName,   
  62. // 認證cookie的名稱  
  63. hash); //加密之后的cookie   
  64.  
  65. //將cookie的失效時間設置為和  
  66. 票據tikets的失效時間一致   
  67. if (ticket.IsPersistent) cookie.  
  68. Expires = ticket.Expiration;   
  69.  
  70. //添加cookie到頁面請求響應中  
  71. Response.Cookies.Add(cookie);   
  72.  
  73. // 將用戶轉向到之前請求的頁面,  
  74. // 如果之前沒有請求任何頁面,就轉向到首頁   
  75. string returnUrl = Request.QueryString  
  76. ["ReturnUrl"];  
  77. if (returnUrl == null) returnUrl = "./";   
  78.  
  79. // 不要調用 FormsAuthentication.  
  80. RedirectFromLoginPage 方法,  
  81. // 因為它會把剛才添加的票據(cookie)替換掉  
  82. Response.Redirect(returnUrl);  
  83. }  
  84. else 
  85. {  
  86. // 不要告訴用戶"密碼錯誤",  
  87. 這樣等于給了入侵者一個機會,  
  88. // 因為他們知道了他們輸入的用戶名是存在的   
  89. //   
  90. ErrorLabel.Text = "用戶名或者密碼錯誤,請重試!";  
  91. ErrorLabel.Visible = true;  
  92. }   
  93. reader.Close();  
  94. conn.Close();  
  95. }   
  96.  
  97. 前臺 aspx 頁面代碼如下:   
  98. 〈 %@ Page language="c#" Codebehind="Login.aspx.cs"   
  99. AutoEventWireup="false"   
  100. Inherits="RolebasedAuth.Login" %〉  
  101. 〈 !DOCTYPE HTML PUBLIC "-//W3C  
  102. //DTD HTML 4.0 Transitional//EN" 〉  
  103. 〈 HTML〉  
  104. 〈 HEAD〉  
  105. 〈 title〉Login〈 /title〉  
  106. 〈 meta name="GENERATOR" Content="Microsoft   
  107. Visual Studio .NET 7.1"〉  
  108. 〈 meta name="CODE_LANGUAGE" Content="C#"〉   
  109. 〈 meta name="vs_defaultClientScript"   
  110. content="JavaScript"〉  
  111. 〈 meta name="vs_targetSchema"   
  112. content="http://schemas.microsoft.com/  
  113. intellisense/ie5 "〉  
  114. 〈 /HEAD〉  
  115. 〈 body〉  
  116. 〈 form id="Form1" method="post" runat="server"〉  
  117. 〈 P〉  
  118. 〈 asp:Label id="Label1" runat="server"〉  
  119. 用戶名:〈 /asp:Label〉   
  120. 〈 asp:TextBox id="UserNameTextBox" runat="server"〉  
  121. 〈 /asp:TextBox〉〈 /P〉  
  122. 〈 P〉〈 FONT face="宋體"〉 〈 /FONT〉  
  123. 〈 asp:Label id="Label2" runat="server"〉  
  124. 密碼:〈 /asp:Label〉   
  125. 〈 asp:TextBox id="PasswordTextBox" runat="server"   
  126. TextMode="Password"〉〈 /asp:TextBox〉〈 /P〉   
  127. 〈 P〉  
  128. 〈 asp:Label id="ErrorLabel" runat="server"   
  129. Visible="False"〉  
  130. 〈 /asp:Label〉〈 /P〉   
  131. 〈 P〉  
  132. 〈 asp:Button id="LoginButton" runat="server"   
  133. Text="登錄"〉  
  134. 〈 /asp:Button〉〈 /P〉  
  135. 〈 /form〉  
  136. 〈 /body〉  
  137. 〈 /HTML〉   

 #p#

你會注意到上面我們對密碼的處理:將它哈希加密。哈希加密是一種單向算法(不可逆算法),生成唯一的字符數組。因此即使是改變密碼中一個字母的大小寫,都會生成完全不同的哈希列。我們把這些加密的密碼存儲在數據庫中,這樣更安全。在實際應用中,你可能想為用戶找回忘記的密碼。但是哈希散列是不可逆的,所以你就不可能恢復原來的密碼。但是你可以更改用戶的密碼,并且把這個更改后的密碼告訴他。如果一個網站能夠給你舊密碼,那么你要考慮清楚了,你的用戶數據是不安全的!事實上,國內大部分網站都是沒有經過加密直接把用戶的密碼存儲到數據庫中的。如何一個黑客入侵成功,那么這些用戶帳戶就很危險了!

如果沒有使用SSL,你的密碼在網絡中也是以明文傳輸的。傳輸過程中可能會被竊取。在服務器端加密密碼只能保證密碼存儲的安全。SSL相關的資料可以在 http://www.versign.com或 http://www.thewte.com 中找到。

如果你不想以加密方式在數據庫中存儲密碼,你可以更改上面的代碼,把

  1. FormsAuthentication.HashPasswordForStoringInConfigFile  
  2. (PasswordTextBox.Text, "md5") 改成  
  3.  PasswordTextBox.Text 即可。  

下一步,我們需要修改 Global.asax 文件。如果你的Web應用程序沒有這個文件,請右鍵單擊Web應用項目,選擇 "添加->添加新項...->Global Application Class"。在 Global.asax 或者 Global.asax.cs 中,找到叫做 Application_AuthenticationRequest 的方法(函數)。先要確認已經包含或者使用了 System.Security.Principal 以及 System.Web.Security 命名空間,然后修改它,修改后的代碼:

  1. protected void Application_AuthenticateRequest  
  2. (Object sender, EventArgs e)   
  3. {  
  4. if (HttpContext.Current.User != null)  
  5. {  
  6. if (HttpContext.Current.User.Identity.  
  7. IsAuthenticated)  
  8. {  
  9. if (HttpContext.Current.User.Identity   
  10. is FormsIdentity)  
  11. {  
  12. FormsIdentity id =  
  13. (FormsIdentity)HttpContext.Current.User.Identity;  
  14. FormsAuthenticationTicket ticket = id.Ticket;   
  15.  
  16. // 取存儲在票據中的用戶數據,  
  17. 在這里其實就是用戶的角色  
  18. string userData = ticket.UserData;  
  19. string[] roles = userData.Split(',');  
  20. HttpContext.Current.User = new   
  21. GenericPrincipal(id, roles);  
  22. }  
  23. }  
  24. }   
  25. }  

認證票據(用戶名和密碼)是沒有作為cookie的一部分來存儲的,而且也不可以,因為用戶可以修改他們的cookie。

事實上,FormsAuthentication是用你的機器碼 (machine key,通常在 machine.config 中)來加密票據(FormsAuthenticationTicket)的。我們使用 UserData 存儲用戶角色,并且生成一個新的憑證。一旦憑證已經創建,它會被添加到當前上下文中(即 HttpContext),這樣就可以用它來取回用戶角色了。

接下來,我們設置機密目錄(也就是"安全目錄",特定的使用者如管理員才有權限訪問的目錄)。首先看看你的Web應用程序根目錄下是否有 Web.config 這個文件,如果沒有就創建一個。你也可以在你的子目錄中創建 Web.config 文件,當然,這個 Web.config 文件是有限制的(一些參數它不可以設置)。要實現安全認證,在 Web應用程序根目錄下的 Web.config 文件中找到 〈system.web〉 節點下的

  1. 〈authentication mode="Windows" /〉,  
  2. 把它修改為   
  3. 〈authentication mode="Forms" 〉  
  4. 〈forms name="AMUHOUSE.ASPXAUTH" 
  5. loginUrl="Login.aspx" 
  6. protection="All" 
  7. path="./" /〉  
  8. 〈/authentication〉  
  9. authorization〉  
  10. 〈allow users="*"/〉  
  11. 〈/authorization 〉  

上面的 name="AMUHOUSE.ASPXAUTH" 中,AMUHOUSE.ASPXAUTH 這個名稱是任意的。要控制用戶或者用戶組的權限,我們可以有兩種方法,一是配置在應用程序根目錄下的 Web.config 文件,二是在機密目錄下創建一個獨立的 Web.config 文件。(后者也許會比較好。)如果是前者,這個Web.config 就應該包含有下面的內容(或者類似的內容):

  1. 〈configuration 〉  
  2. 〈system.web 〉  
  3. 〈authentication mode="Forms" 〉  
  4. 〈forms name=" AMUHOUSE.ASPXAUTH" 
  5. loginUrl="login.aspx" 
  6. protection="All" 
  7. path="/"/ 〉  
  8. 〈/authentication 〉  
  9. authorization 〉   
  10. 〈allow users="*"/ 〉  
  11. 〈/authorization 〉  
  12. 〈/system.web 〉  
  13. 〈location path="./Admin" 〉  
  14. 〈system.web 〉  
  15. authorization 〉   
  16. 〈!-- 注意!下面幾行的順序和大小寫是非常重要的! -- 〉  
  17. 〈allow roles="Administrator"/ 〉  
  18. 〈deny users="*"/ 〉  
  19. 〈/authorization 〉  
  20. 〈/system.web 〉   
  21. 〈/location 〉  
  22. 〈location path="./User" 〉  
  23. 〈system.web 〉  
  24. authorization 〉  
  25. 〈!-- 注意!下面幾行的順序和大小寫是非常重要的! -- 〉  
  26. 〈allow roles="User"/ 〉   
  27. 〈deny users="*"/ 〉  
  28. 〈/authorization 〉  
  29. 〈/system.web 〉  
  30. 〈/location 〉  
  31. 〈/configuration 〉  

為了使Web應用程序的目錄之前不互相依賴,可以比較方便的改名或者移動,可以選擇在每一個安全子目錄下配置單獨的 Web.config 文件。它只需要配置 〈authorization/〉節點,如下:

  1. 〈 configuration 〉  
  2. 〈 system.web 〉  
  3. 〈 authorization 〉  
  4. 〈 !-- 注意!下面幾行的順序和大小寫是非常重要的! -- 〉  
  5. 〈 allow roles="Administrator"/ 〉   
  6. 〈 deny users="*"/ 〉  
  7. 〈 /authorization 〉  
  8. 〈 /system.web 〉  
  9. 〈 /configuration 〉 

需要再次提醒的是,上面的角色 roles 是大小寫敏感的,為了方便,你也可以把上面修改為:

  1. 〈 allow roles="Administrator,administrator" /〉 

如果你想允許或者禁止多個角色對這個目錄的訪問,可以用逗號隔開,如:

  1. 〈 allow roles="Administrator,Member,User" /〉  
  2. 〈 deny users="*" /〉  

至此,我們已經為網站配置了基于角色的ASP.NET安全認證機制了。

你可以先編譯你的程序,然后嘗試訪問一個機密目錄,例如 http://localhost/RolebasedAuth/Admin,這時候你就會被轉向到用戶登錄頁面。如果你登錄成功,并且你的角色對這個目錄有訪問權限,你就重新回到這個目錄下。可能會有用戶(或入侵者)企圖進入機密目錄,我們可以使用一個 Session 來存儲用戶登錄的次數,超過一定次數就不讓用戶登錄,并且顯示"系統拒絕了你的登錄請求!"。

下面,我們討論如何根據用戶角色讓Web控件顯示不同內容。

有時候根據用戶的角色來顯示內容比較好,因為你可能不想為那么多不同的角色(用戶群組)制作一大堆有許多重復內容的頁面。這樣的網站,各種用戶帳戶可以并存,付費的用戶帳戶能夠訪問附加的付費內容。另一個例子是一個頁面將顯示一個 "進入后臺管理" 按鈕鏈接到后臺管理頁面如果當前用戶是 "Administrator"(高級管理員)角色。我們現在就實現這個頁面。

 #p#

我們上面用到的 GenericPrincipal 類實現了 IPincipal 接口,這個接口有一個方法名叫做 IsInRole(),它的參數是一個字符串,這個字符串就是要驗證的用戶角色。如果我們要顯示內容給角色是 "Administrator"的已登錄用戶,我們可以在 Page_Load 中添加下面代碼: 程序代碼

  1. if (User.IsInRole("Administrator"))  
  2. AdminLink.Visible = true;   
  3. 整個的頁面代碼如下  
  4. (為了簡便,把后臺代碼也寫在aspx頁面): 程序代碼   
  5. 〈html 〉  
  6. 〈head 〉  
  7. 〈title 〉歡迎您!〈/title 〉  
  8. 〈script runat="server" 〉   
  9. protected void Page_Load(Object sender,   
  10. EventArgs e)  
  11. {  
  12. if (User.IsInRole("Administrator"))  
  13. AdminLink.Visible = true;  
  14. else 
  15. AdminLink.Visible = false;  
  16. }  
  17. 〈/script 〉   
  18. 〈/head 〉  
  19. 〈body 〉  
  20. 〈h2 〉歡迎!〈/h2 〉  
  21. 〈p 〉歡迎來到阿木小屋   
  22. http://amuhouse.com/ ^_^〈/p 〉  
  23. 〈asp:HyperLink id="AdminLink" runat="server"   
  24. Text="管理首頁" NavigateUrl="./Admin"/ 〉  
  25. 〈/body 〉  
  26. 〈/html 〉   

樣,鏈接到 Admin 目錄的HyperLink 控件只會顯示給角色是 Administrator 的用戶。你也可以根據為未登錄用戶提供一個鏈接到登錄頁面,如:程序代碼

  1. protected void Page_Load  
  2. (object sender, System.EventArgs e)  
  3. {   
  4. if (User.IsInRole("Administrator"))  
  5. {  
  6. AdminLink.Text = "管理員請進";  
  7. AdminLink.NavigateUrl="./Admin";   
  8. }  
  9. else if(User.IsInRole("User"))  
  10. {  
  11. AdminLink.Text = "注冊用戶請進";  
  12. AdminLink.NavigateUrl="./User";   
  13. }   
  14. else   
  15. {  
  16. AdminLink.Text = "請登錄";  
  17. AdminLink.NavigateUrl="Login.aspx?  
  18. ReturnUrl=" + Request.Path;  
  19. }   
  20. }   

這里,我們通過設置叫做ReturnUrl的 QueryString 變量,可以使用戶登錄成功后返回到當前的這個頁面.

小結:

本文用于幫助你理解基于角色安全機制的重要性、實用性,并且也通過ASP.NET安全認證機制實現了基于角色的安全控制。它并不是一個很難實現的機制,不過它可能需要一些相關知識如 什么是用戶憑證,如何認證用戶身份,以及如何審定授權用戶。如果你覺得它很有幫助,我會非常高興。我希望它可以引導你在你的網站中去實現基于角色的窗體安全認證機制。

【編輯推薦】

  1. ASP.NET環境下的Shell函數
  2. 在ASP.NET中向數據庫批量插入數據
  3. ASP.NET用Post方式向網頁發送數據
  4. ASP.NET 2.0部署WEB應用程序淺析
  5. ASP.NET中的HttpWorkerRequest對像
  6. 介紹ASP.NET MVC框架
責任編輯:冰荷 來源: it55
相關推薦

2009-07-29 10:56:54

ASP.NET構架與安

2009-07-23 16:59:31

ASP.NET認證Form表單

2009-07-29 13:04:59

2009-12-21 10:05:10

ASP.NET MVC

2009-08-04 15:22:33

ASP.NET緩存機制

2012-04-16 09:54:26

2009-07-27 13:39:06

Web窗體頁ASP.NET

2009-08-03 18:35:51

ASP.NET數據緩存

2009-08-17 16:59:36

ASP.NET緩存機制

2012-05-07 14:50:32

ASP.NET

2009-06-12 09:24:34

ASP.NET窗體ASP.NET MVC

2009-07-22 17:45:11

ASP.NET插件

2009-07-20 15:44:32

ASP.NET MVC

2009-04-08 09:58:07

ASP.NET MVCTempData框架

2009-06-19 16:20:14

ASP.NET錯誤處理

2009-07-23 17:05:11

ASP.NET安全性

2009-07-20 15:57:42

ASP.NET安全架構

2009-12-07 09:23:05

ASP.NET MVC

2009-07-22 17:45:35

ASP.NET教程

2009-08-03 14:22:33

什么是ASP.NET
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频一区在线 | 99久久99| 成人小视频在线观看 | 日韩成人性视频 | 福利视频日韩 | 亚洲免费一区 | 久草热线| 成人毛片一区二区三区 | 日本精品视频一区二区三区四区 | 欧美日韩久久 | 91中文| 我爱操| 久久久精品一区 | 日韩一区二区福利视频 | 久久久久成人精品免费播放动漫 | 精品久久久久久久人人人人传媒 | 国产在线一区二区三区 | 国产视频精品视频 | 精品乱码一区二区 | 国产激情在线 | 91亚洲国产亚洲国产 | 日韩在线免费视频 | 久久久国产一区二区三区 | 亚洲一区视频在线 | 国产电影一区 | 国产精选一区 | 天天操夜夜拍 | 黄色一级视频免费 | 欧美视频中文字幕 | 亚洲午夜av久久乱码 | 日韩电影一区二区三区 | 亚洲国产精品成人无久久精品 | 久久99精品久久久久久青青日本 | 亚洲视频二区 | 韩日免费视频 | 国产特级毛片 | 范冰冰一级做a爰片久久毛片 | 中文字幕一区二区三区日韩精品 | 成人在线欧美 | 久热久草| 91福利网|