成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Asp.Net實現(xiàn)FORM認(rèn)證的一些使用技巧(必看篇)

Asp.Net實現(xiàn)FORM認(rèn)證的一些使用技巧(必看篇)

熱門標(biāo)簽:電銷專用外呼線路 400電話唐山辦理 地圖標(biāo)注位置怎么弄圖 威力最大的電銷機器人 廣西房產(chǎn)智能外呼系統(tǒng)推薦 漯河外呼調(diào)研線路 電銷外呼系統(tǒng)是違法的嗎 電話機器人鑰匙扣 旅游地圖標(biāo)注線路

最近因為項目代碼重構(gòu)需要重新整理用戶登錄和權(quán)限控制的部分,現(xiàn)有的代碼大體是參照了.NET的FORM認(rèn)證,并結(jié)合了PORTAL KITS的登錄控制,代碼比較啰嗦,可維護性比較差。于是有了以下的幾個需求(大多數(shù)系統(tǒng)應(yīng)該都會碰到):

1.用.NET自帶的FORM認(rèn)證來實現(xiàn)安全登錄

2.登錄后需要記錄登錄用戶的基本信息,方便所有頁面調(diào)用

3.記錄本機登錄狀態(tài),短時間關(guān)閉窗口后不用重新登錄

4.權(quán)限控制和代碼的文件夾結(jié)構(gòu)相呼應(yīng),即按角色允許訪問不同的目錄

5.權(quán)限控制有可能需要細(xì)化到每一個頁面,即按角色允許訪問不同的頁面

6.以上的部分盡量自己少寫代碼,用自帶的類庫和機制實現(xiàn)

第一步:準(zhǔn)備工作

先準(zhǔn)備一個名為Test的WEB項目,包含:

Default.aspx,默認(rèn)頁,隨便顯示一些信息,

Login.aspx,登錄頁,上面放兩個文本框,用來輸入用戶名和密碼,一個登錄按鈕,一個指向Register.aspx的超鏈,

Register.aspx,用戶注冊頁,注冊用戶信息,隨便放一點文本框,主要是模擬一下注冊,不用真正實現(xiàn),

Web.config,配置頁面。

注冊頁與登錄頁在同一目錄的機妙后面會說。

第二步:Web.config文件的修改

1、打開Web.config文件,找到authentication節(jié),將其改為如下:

authentication mode="Forms">
  forms name=".ASPXAUTH" loginUrl="Login.aspx" protection="All" path="/" timeout="20"/>
/authentication>
authorization>
  deny users="?">/deny>
/authorization>

配置節(jié)屬性的具體意義和其他沒有加入的屬性網(wǎng)上到處都有查。這里注意一下的是authentication節(jié)和authorization節(jié),兩個單詞很相似,但卻不是同一個單詞,每個節(jié)下面的內(nèi)容也不能寫到一起。

其中,authorization節(jié)中的“allow”表示允許的意思,“*”表示所有用戶;而“deny”表示拒絕的意思;“?”表示匿名用戶;此處加入后,則代表根目錄下的所有文件和所有的子目錄都不能匿名訪問,Login.aspx 頁面除外。

2、Web.config中,Location節(jié)的應(yīng)用

做了上面的配置之后,我們會發(fā)現(xiàn),在沒登錄的情況下,用瀏覽器打開Default.aspx會自動轉(zhuǎn)到Login.aspx,同理Register.aspx頁面也會如此。問題:注冊用戶怎么可能在登錄后才能訪問呢?

那么我們就得說了,當(dāng)注冊頁與登錄頁在同一目錄,為了達(dá)到不用登錄就能訪問注冊頁的目的,我們就得對訪問限制的Web.config配置處理一下。

方法一 :注冊頁與登錄頁放在不的目錄內(nèi)

我們在根目錄添加一個文件夾Pub,將Register.aspx移動到此文件夾里,此時仍不能訪問,需要在文件夾內(nèi)添加一個Web.config文件,加入:

configuration> 
 system.web> 
  authorization>
   allow users="*"/>
  /authorization> 
 /system.web> 
/configuration> 

此處,即說明此目錄下的所有文件,允許所有人訪問。

關(guān)于 Web.config 作用范圍的說明:

• Web.config 的設(shè)置將作用于所在目錄的所有文件及其子目錄下的所有東東(繼承:子隨父姓)

• 子目錄下的 Web.config 設(shè)置將覆蓋由父目錄繼承下來的設(shè)置(覆蓋:縣官不如現(xiàn)管)

• 也就是,屬性設(shè)置由最深一層的目錄里的Web.config決定;如果子目錄里沒有Web.config文件,則由離它最近的父目錄里的Web.config決定

方法二:仍然保持注冊頁和登錄頁在同一目錄下

只需要在根目錄下的Web.config 中加入以下一段:

location path="Register.aspx">
 system.web>
   authorization>
    allow users="*"/>
   /authorization>
 /system.web>
/location>

通過location節(jié)的path屬性的值指定Register.aspx頁面,以及下面authorization節(jié)的設(shè)置,說明了Register.aspx頁面是允許被所有人訪問。

注意:

location節(jié)應(yīng)加在原有的system.web節(jié)的外面,包含在configuration節(jié)內(nèi),和system.web節(jié)是同級的。  

當(dāng)根目錄下,有多個頁面不需要登錄就可以訪問時,可以設(shè)置多個location節(jié),修改對應(yīng)path屬性值指向的頁面就可以了。

另外,path屬性的值也可以指定目錄,用來指定該目錄的訪問限制。通過修改authorization節(jié)的內(nèi)容來限定訪問權(quán)限。詳細(xì)的設(shè)置,后面會提到。

第三步:實現(xiàn)登錄的代碼

1、普通的代碼實現(xiàn)

方法一:

如果forms節(jié)中設(shè)置了“defaultUrl”的屬性,也就是登錄后默認(rèn)轉(zhuǎn)向的頁面,則可以用如下的方法:

private void Btn_Login_Click(object sender, System.EventArgs e) 
{ 
 if(this.Txt_UserName.Text=="Admin"  this.Txt_Password.Text=="123456") 
 { 
   FormsAuthentication.RedirectFromLoginPage(this.Txt_UserName.Text,false); 
 } 
} 

此處只是簡單模擬了一下登錄的驗證過程,RedirectFromLoginPage方法能發(fā)送驗證票據(jù)驗證Cookie(如何進(jìn)行可以用Reflector去查看源代碼),返回請求頁面,即“從哪來就打哪去”。比如:用戶沒登錄前直接在 IE 地址欄輸入 http://localhost/Test/Default.aspx ,那么該用戶將看到的是 Login.aspx?ReturnUrl=Default.aspx ,輸入用戶名與密碼登錄成功后,系統(tǒng)將根據(jù)“ReturnUrl”的值,返回相應(yīng)的頁面;如果沒有“ReturnUrl”,則按照“defaultUrl”的屬性自動轉(zhuǎn)向。

方法二:

private void Btn_Login_Click(object sender, System.EventArgs e)
{ 
  if(this.Txt_UserName.Text=="Admin"  this.Txt_Password.Text=="123456") 
  { 
   FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); 
   Response.Redirect("Default.aspx"); 
  } 
} 


此處是分兩步走:通過驗證后就直接發(fā)放 Cookie ,跳轉(zhuǎn)頁面將由程序員自行指定,無需“defaultUrl”設(shè)置。此方法對于程序員來說,更靈活?! ?/p>

2、手工實現(xiàn)需要記錄用戶登錄信息的情況

當(dāng)我們需要記錄用戶登錄的信息,不單單只是一個ID還需要更多屬性的時候,一般都用一個類存儲到Session或Cookie實現(xiàn),然后做一個基類頁,在基類頁中設(shè)置屬性來讀取Session或Cookie。

Session實際也和支不支持Cookie有關(guān),且存在服務(wù)器,多少會占用服務(wù)器端資源。因此這里還是考慮用Cookie實現(xiàn)。那么在RedirectFromLoginPage方法或SetAuthCookie方法已經(jīng)設(shè)置了驗證票據(jù)并設(shè)置了Cookie,我們能不能把用戶登錄信息也存儲到這個默認(rèn)的Cookie里呢?答案是能。

首先,我們在項目里添加AppCode目錄,增加一個UserInfo的類,用以簡單模擬用戶登錄信息。代碼如下:

[Serializable]
public class UserInfo
{
  //用戶登錄信息
  private int _nId;
  private string _sRealName;
  private string _sName;  
  private string _sPassword;
  private string _sRoles;

  public int Id
  {
    get { return this._nId; }
    set { this._nId = value; }
  }
  public string RealName
  {
    get { return this._sRealName; }
    set { this._sRealName = value; }
  }
  public string Name
  {
    get { return this._sName; }
    set { this._sName = value; }
  }
  public string Password
  {
    get { return this._sPassword; }
    set { this._sPassword = value; }
  }
  public string Roles
  {
    get { return this._sRoles; }
    set { this._sRoles = value; }
  }

  public UserInfo()
  {    
  }
}

需要注意, 類的屬性中一定要加[Serializable],表示類可以序列化。

Forms驗證在內(nèi)部的機制是,把用戶數(shù)據(jù)加密后保存在一個基于cookie的票據(jù)FormsAuthenticationTicket中,通過RedirectFromLoginPage方法或SetAuthCookie方法就已經(jīng)實現(xiàn)了Ticket和Cookie的設(shè)置,也就是設(shè)置了Context.User的值,Context.User在取值和判斷是否經(jīng)過驗證的時候很有用處。Cookie的屬性是在Web.config的forms name=".ASPXAUTH" loginUrl="Login.aspx" protection="All" path="/" timeout="20"/>中設(shè)置的。因為是經(jīng)過特殊加密的,所以應(yīng)該來說是比較安全的。

而.net除了用這個票據(jù)存放自己的信息外,還留了一個地給用戶自由支配,這就是現(xiàn)在要說的Ticket的UserData。 UserData用來存儲string類型的信息,并且也享受Forms驗證提供的加密保護,當(dāng)我們需要這些信息時,也可以通過簡單的Ticket的 UserData屬性得到,兼顧了安全性和易用性,用來保存一些必須的敏感信息還是很有用的。我們就準(zhǔn)備將用戶的登錄信息記錄在UserData中,代碼如下:

protected void Button1_Click(object sender, EventArgs e)
  {
    if (this.TextBox1.Text == "Admin"  this.TextBox2.Text == "123456")
    {
      // 加密UserInfo
      UserInfo user = new UserInfo();
      user.Id = 1;
      user.Name = this.TextBox1.Text;
      user.Password = this.TextBox2.Text;
      user.RealName = "系統(tǒng)管理員";
      user.Roles = "Administrators,Users";
      string strUser = Serialize.EncryptUserInfo>(user);

      // 設(shè)置Ticket信息
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
        1, user.Name, DateTime.Now, DateTime.Now.AddMinutes(20), false, strUser);

      // 加密驗證票據(jù)
      string strTicket = FormsAuthentication.Encrypt(ticket);

      // 使用新userdata保存cookie
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, strTicket);
      cookie.Expires = ticket.Expiration;
      this.Response.Cookies.Add(cookie);
      

      this.Response.Redirect("Default.aspx");
    }
}

上面的代碼,實際上類似于手工實現(xiàn)了SetAuthCookie方法的過程。

首先,模擬實現(xiàn)登錄,我們手動設(shè)置了一個UserInfo的對象,string strUser = Serialize.EncryptUserInfo>(user) 是將對象序列化成字符串的一個方法。

  然后,生成一個FormsAuthenticationTicket票據(jù)。此處用到的FormsAuthenticationTicket構(gòu)造函數(shù)的重載方法的簽名解釋

public FormsAuthenticationTicket( 
    int version, //版本號
    string name, //與身份驗證票關(guān)聯(lián)的用戶名
    DateTime issueDate, //票據(jù)的發(fā)出時間
    DateTime expiration,//票據(jù)的到期日期
    bool isPersistent, //票據(jù)是否存儲在持久的 Cookie 中,是為 true;否則為 false
    string userData //票據(jù)中存儲的用戶定義數(shù)據(jù)
);

再后,string strTicket = FormsAuthentication.Encrypt(ticket) 將票據(jù)加密成字符創(chuàng)

最后,HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, strTicket) 生成Cookie。

FormsAuthentication.FormsCookieName獲取的就是Web.config中配置的Cookie名稱,也就是默認(rèn)驗證時產(chǎn)生的Cookie。cookie.Expires = ticket.Expiration 將票據(jù)的過期時間和Cookie的過期時間做了同步,也就避免了兩者不同所產(chǎn)生的矛盾。這樣,驗證票據(jù)生成了,存儲到默認(rèn)配置的Cookie中,也就是類似實現(xiàn)了一個SetAuthCookie方法的過程。通過Context.User就能獲取票據(jù)的相關(guān)信息了。

3、獲取信息

為了在其他登錄后的頁面比較簡單的獲取登錄用戶信息,我們先生成一個基類頁面。在AppCode中新增LoginBasePage類,代碼如下:

public class LoginBasePage : Page
{
  protected UserInfo LoginUser
  {
    get
    {
      string strUser = ((FormsIdentity)this.Context.User.Identity).Ticket.UserData;

      return Serialize.DecryptUserInfo>(strUser);        
    }
  }

  public LoginBasePage()
  {
    //
    // TODO: 在此處添加構(gòu)造函數(shù)邏輯
    //
  }
}

LoginBasePage : Page,基類頁要繼承Page,成為所有登錄以后的頁面的基類。

屬性protected UserInfo LoginUser{ get;}用來訪問登錄信息。將Context.User.Identity強制轉(zhuǎn)換為FormsIdentity類的對象,通過訪問Ticket屬性的UserData屬性,獲得被序列化后的對象的字符串,最后用方法Serialize.DecryptUserInfo>(strUser)將字符串反序列化成對象后再返回UserInfo類型的對象。

我們只需要將Default頁面的后臺代碼改為public partial class _Default : LoginBasePage,就可以通過this.LoginUser來訪問用戶登錄信息了。

第四步:實現(xiàn)不同目錄的權(quán)限控制

上面,實現(xiàn)了記錄用戶登錄信息的模擬登錄過程,以及根目錄下文件的訪問控制。但是系統(tǒng)一般都會有多個目錄,接下來就說說目錄的訪問控制。

其實,上面多多少少已經(jīng)提到過了,通過在每個目錄下增加Web.config文件來進(jìn)行訪問限制。

首先,我們在根目錄增加一個文件夾ManageAdmin,在此文件夾內(nèi)增加頁面UserInfo.aspx,頁面內(nèi)放幾個Label用來展現(xiàn)登錄用戶信息。

然后,再增加一個Web.config文件,配置內(nèi)容如下:

configuration>
  appSettings/>
  connectionStrings/>
  system.web>
    authorization>
      allow users="Admin">/allow>
      deny users="*">/deny>
    /authorization>
  /system.web>
/configuration>

配置中說明只允許“Admin”用戶訪問,禁止其他所有用戶訪問。

這里,特別要注意的是,F(xiàn)ormsAuthenticationTicket票據(jù)的name屬性的賦值,一定要和allow users="Admin">/allow>設(shè)置的用戶想對應(yīng),且大小寫敏感。如果要設(shè)置允許多個用戶訪問,則用“,”隔開,例如allow users="Admin,User1">/allow>。

不同的目錄,設(shè)置不同的允許訪問的用戶,就可以對所有目錄進(jìn)行訪問控制了。

第五步:實現(xiàn)不同目錄的按角色的權(quán)限控制

以上實現(xiàn)了對不同目錄按用戶的訪問限制。但是一般來說,一個網(wǎng)站系統(tǒng)的用戶會很多,如果一直使用精確到用戶的訪問控制,則會造成設(shè)置Web.config的工作量加大。

而一般,我們會將用戶分到不同的用戶組來進(jìn)行權(quán)限控制,因此,我們也可以配置Web.config實現(xiàn)按角色來控制不同的目錄的訪問權(quán)限。

首先,我們在根目錄下再增加一個目錄ManageUsers,在此文件夾內(nèi)也增加頁面UserInfo.aspx用來展現(xiàn)登錄用戶信息。此目錄將模擬控制Users組的用戶,文件夾ManageAdmin將模擬控制Administrators組的用戶。

然后,在目錄ManageUsers增加Web.config文件,配置內(nèi)容如下:

configuration>
  appSettings/>
  connectionStrings/>
  system.web>
    authorization>
      allow roles="Users">/allow>
      deny users="*">/deny>
    /authorization>
  /system.web>
/configuration>

再將文件夾ManageAdmin下的Web.config文件的allow users="Admin">/allow>改成allow roles="Administrators">/allow>

最后,修改代碼。

1、注意,我們在模擬用戶信息的時候,有這么一句,user.Roles = "Administrators,Users";也就是用戶Admin具備兩種角色

2、為模擬Users組的用戶登錄,我們再添加如下代碼:

if (this.TextBox1.Text == "User1"  this.TextBox2.Text == "111111")
{
      // 加密UserInfo
      UserInfo user = new UserInfo();
      user.Id = 2;
      user.Name = this.TextBox1.Text;
      user.Password = this.TextBox2.Text;
      user.RealName = "普通用戶1";
      user.Roles = "Users";
      string strUser = Serialize.EncryptUserInfo>(user);

      // 設(shè)置Ticket信息
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
        1, user.Name, DateTime.Now, DateTime.Now.AddMinutes(20), false, strUser);

      // 加密驗證票據(jù)
      string strTicket = FormsAuthentication.Encrypt(ticket);

      // 使用新userdata保存cookie
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, strTicket);
      cookie.Expires = ticket.Expiration;
      this.Response.Cookies.Add(cookie);
      

      this.Response.Redirect("Default.aspx");
 }

這樣,我們登錄時,輸入“Admin”和“User1”的時候,就可以模擬不同角色的用戶登錄了。

3、Forms基于角色的驗證的內(nèi)部機制是,將角色的屬性也設(shè)置到了Context.User中,這里也需要手工代碼處理一下。  

首先,為了支持基于角色的驗證,我們每進(jìn)入一個頁面都需要將角色信息設(shè)置到Context.User中,那么最好的辦法就是在Global.asax 文件中的Application_AuthenticateRequest方法中設(shè)置。

Application_AuthenticateRequest方法,是在每次驗證請求時觸發(fā),它與另外一個方法Application_BeginRequest的區(qū)別就在于,Application_AuthenticateRequest方法內(nèi),能夠訪問Context.User.Identity,而Application_BeginRequest則無法訪問。

我們在根目錄添加一個Global.asax 文件,增加如下代碼:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
  {
    if (this.Context.User != null)
    {
      if (this.Context.User.Identity.IsAuthenticated)
      {
        if (this.Context.User.Identity is FormsIdentity)
        {
          string strUser = ((FormsIdentity)this.Context.User.Identity).Ticket.UserData;

          string[] roles = Serialize.DecryptUserInfo>(strUser).Roles.Split(',');

          this.Context.User = new GenericPrincipal(this.Context.User.Identity, roles);
        }
      }
    }
  }

此處,主要代碼就是將Context.User.Identity強制轉(zhuǎn)換為FormsIdentity類的對象,通過訪問Ticket屬性的UserData屬性,獲得被序列化后的對象的字符串,最后用方法Serialize.DecryptUserInfo>(strUser)將字符串反序列化成對象,再將UserInfo對象的Roles屬性以“,”為分隔符分隔成角色數(shù)組,再用Context.User.Identity和角色數(shù)組生成一個新的GenericPrincipal對象,賦值給Context.User ,則Context.User 為已經(jīng)設(shè)置好角色的驗證對象。

按照我們的設(shè)置,Admin用戶能訪問兩個目錄,而User1用戶,則只能訪問ManageUsers一個目錄。

第六步:集中管理Web.config文件

目錄的訪問權(quán)限控制,是按用戶還是按角色,一般由具體業(yè)務(wù)決定。

但是,隨著目錄的增多,每個目錄下都存在一個Web.config文件,管理起來特別不方便。

通過上面提到過的location節(jié)的path屬性,我們可以實現(xiàn)Web.config配置的統(tǒng)一管理。我們可以將各個文件或目錄的配置都放置在根目錄的Web.config文件內(nèi),代碼如下:

configuration>
  appSettings/>
  connectionStrings/>

  location path ="Register.aspx">
    system.web>
      authorization>
        allow users="*"/>
      /authorization>
    /system.web>
  /location>

    location path ="ManageAdmin">
    system.web>
      authorization>
        allow roles="Administrators">/allow>
          deny users="*">/deny>
      /authorization>
    /system.web>
  /location>

    location path ="ManageUsers">
    system.web>
      authorization>
        allow roles="Users">/allow>
          deny users="*">/deny>
      /authorization>
    /system.web>
  /location>

    system.web>
    !-- 這里放置原來根目錄 Web.config 的內(nèi)容,就不列出來了 -->
     /system.web>

/configuration>

結(jié)尾:

這次徹底理順FORM驗證的過程,發(fā)現(xiàn)了不少實用性很強的技巧,中間參考了很多網(wǎng)友的文章,也通過Reflector看了一下具體實現(xiàn)的源代碼。感覺收獲不少,最大的收獲就是對于問題不但要知其然更要知其所以然,要有一種打破沙鍋問到底的凈勝。

大家如果有什么問題有什么疑問,不但要找到解決的辦法,有時間的話最好從理論到底層代碼都好好過一過,對自己的水平長進(jìn)有很大的幫助。

以上這篇Asp.Net實現(xiàn)FORM認(rèn)證的一些使用技巧(必看篇)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • asp.net 特定目錄form驗證
  • ASP.NET的實用技巧詳細(xì)介紹
  • .net實現(xiàn)網(wǎng)站用戶登錄認(rèn)證

標(biāo)簽:湖北 無錫 試駕邀約 焦作 湘西 銅陵 欽州 綏化

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Asp.Net實現(xiàn)FORM認(rèn)證的一些使用技巧(必看篇)》,本文關(guān)鍵詞  Asp.Net,實現(xiàn),FORM,認(rèn)證,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Asp.Net實現(xiàn)FORM認(rèn)證的一些使用技巧(必看篇)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Asp.Net實現(xiàn)FORM認(rèn)證的一些使用技巧(必看篇)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    亚洲色图视频免费播放| 99久久综合国产精品二区| 国产麻豆天美果冻无码视频| 69久久夜色| 亚洲综合免费观看高清完整版在线| 日本一级淫片免费放| 91丨九色丨国产丨porny| 一区二区三区免费网站| 国产一二三四区在线| 亚洲色图五月天| 情侣偷拍对白清晰饥渴难耐| 成年女人毛片| 久久久亚洲精品无码| 日本夜夜草视频网站| 亚洲mv大片欧洲mv大片精品| 成人au免费视频影院| 中国黄色片一级| 亚洲国产精品一区制服丝袜| 无码人妻一区二区三区精品视频| 在线观看网站黄| 亚洲欧美日韩国产| 在线电影欧美日韩一区二区私密| 国产三级欧美三级日产三级99| 91看片淫黄大片91| 国产亚洲综合精品| 日本中文字幕免费观看| 亚洲黄色小说网站| 不卡一卡2卡3卡4卡精品在| 性欧美亚洲xxxx乳在线观看| 国产极品999| 国产精品白丝jk喷水视频一区| www黄com| 伊人色**天天综合婷婷| 婷婷激情成人| av午夜在线观看| 国产v日产∨综合v精品视频| 首页亚洲欧美制服丝腿| 亚洲精品久久久久久国产精华液| 免费污片软件| 国产天堂视频| 精品国产第一页| 91玉足脚交白嫩脚丫| 大地资源高清播放在线观看| 丰满人妻老熟妇伦人精品| 亚洲www啪成人一区二区麻豆| 91午夜视频| 男女激情视频网站| 91久久精品久久国产性色也91| 欧洲s码亚洲m码精品一区| www.成人| 成人久久一区二区三区| 福利片在线一区二区| 青草影视电视剧免费播放在线观看| 福利微拍一区二区| 高潮毛片又色又爽免费| 亚洲免费激情视频| 亚洲福利在线观看视频| www.中文字幕在线观看| 中文字幕黄色网址| 香蕉视频国产在线| 秋霞影院一区二区| 国产尤物一区二区三区| 日本不卡免费新一二三区| 国产综合久久久久久| 日韩电影免费观看高清完整| 欧美综合在线视频观看| av在线亚洲一区| 日韩成人伦理电影在线观看| 男男激情在线| 综合中文字幕亚洲| 在线不卡日本| 久久久国产精品一区二区三区| 91精品国产福利在线观看麻豆| 久久久久久国产精品久久| 亚洲综合丁香| 亚洲素人一区二区| 亚洲视频一区二区在线观看| 日韩电影免费在线观看中文字幕| 最新av在线播放| 草久在线视频| 国产成人精品在线播放| 国产精品久久久久av电视剧| 污网站在线免费看| 亚洲成人影院在线观看| 国产suv精品一区二区68| 男人亚洲天堂网| 精品国产户外野外| 中文字幕日韩精品久久| 黄色小视网站| 久久久久狠狠高潮亚洲精品| 一本久道久久综合狠狠爱亚洲精品| 最新久久zyz资源站| 国产精品无码2021在线观看| 香蕉久久夜色精品国产使用方法| 国产91精品对白在线播放| 亚洲性猛交xxxx乱大交| 国产精品99久久久精品无码| 国产美女久久久| 色是在线视频| 91视频91自| 久久久久久久久久久久久久久久久久久久| 久草热在线观看| 一本久道久久综合狠狠爱| 久久99日本精品| 亚洲午夜久久久久中文字幕久| 少妇高潮露脸国语对白| 亚洲精品国产一区二区三区| www.四虎网站| 精品人妻少妇嫩草av无码专区| 中文精品电影| 成年人黄视频在线观看| 久久国产精品国语对白| 成人精品视频.| 97免费在线观看视频| 欧美电影在线观看网站| 欧美精品一级二级三级| 国产精品久久久久久久免费观看| 免费av中文字幕| 亚洲成人激情社区| **精品中文字幕一区二区三区| 先锋男人资源站| 成人教育av| 日本在线观看大片免费视频| 无限国产资源| 无线免费在线视频| 欧美97人人模人人爽人人喊视频| 久久久中精品2020中文| 欧美一区亚洲| jizz久久精品永久免费| 高清国语自产拍免费视频国产| 国产福利一区二区| 日本中文字幕电影在线观看| 在线一区二区三区四区五区| 国产精品成人免费一区二区视频| 韩国av中国字幕| 国产精品久久亚洲不卡| 亚洲一区中文字幕在线| 国产精品1区在线| 91精品国产乱码久久久久久| 欧美 日韩 国产 成人 在线观看| 凹凸精品一区二区三区| 伊人久久青草| 美丽的小蜜桃4春潮| 欧美午夜小视频| 欧美自拍视频| 亚洲精品视频久久| 亚洲国产一区自拍| 高清电影一区| 人妻偷人精品一区二区三区| www.激情小说.com| 日韩人妻精品中文字幕| 91精品国产沙发| 色哟哟一区二区三区| 亚洲美女av网站| 亚洲成人av电影| 粉色视频免费看| 在线综合视频播放| 国产成人亚洲精品青草天美| 在线不卡一区二区| 欧美色蜜桃97| 久久久久高潮毛片免费全部播放| 91热视频在线观看| 九九99久久精品在免费线bt| 亚洲欧美日韩在线综合| 91精品麻豆| 国产欧美亚洲日本| 一区二区三区四区欧美日韩| 亚洲视频精品在线| 亚洲免费黄色网| 日韩制服诱惑| 欧美日产在线观看| 91极品在线| 狠狠色噜噜狠狠狠888奇米| 欧美大片大片在线播放| 国产精品无码久久久久久| 国产伦精品一区二区三区四区免费| 国产亚洲欧美在线精品| 欧美日韩另类在线| 色偷偷亚洲第一成人综合网址| y111111国产精品久久婷婷| 国产哺乳奶水91在线播放| 国内精品一区二区| 欧美韩国日本精品一区二区三区| 99久久久久免费精品国产| 五月天最新网址| 黑人乱码一区二区三区av| 国产艳俗歌舞表演hd| 精品久久久久av影院| 日本免费在线一区| 国产精品成人免费精品自在线观看| 久久久久一区二区三区四区| 国产精品成人免费在线| 午夜av电影| 国产视频网站在线观看| 欧美嫩在线观看| 国产精品白丝喷水在线观看| www.成年人视频| 国产午夜精品免费一区二区三区| 国内精品国产三级国产aⅴ久| 中文字幕第一页在线播放| 蜜桃视频在线观看www| 亚洲电影av| 精品午夜一区二区三区在线观看| 高清欧美精品xxxxx在线看| 曰本一区二区三区视频| 欧美亚洲一区| 黄色仓库视频网站| 精品福利电影| 亚洲欧洲日韩综合一区二区| 成人免费高清视频| 国产欧美日韩中文字幕| 成人免费视频网站在线看| 波多野结衣91| 国产乱子夫妻xx黑人xyx真爽| 国产在亚洲线视频观看| 91国在线高清视频| 97国产精品videossex| 成人毛片在线播放| 久久的色偷偷| 中文字幕在线观看视频一区| 激情欧美一区二区三区| 丝袜美腿亚洲综合| 欧美精彩视频一区二区三区| 欧美激情成人| 麻豆短视频在线观看| 高清久久一区| 精品处破学生在线二十三| 久久久久久蜜桃一区二区| 99久久婷婷国产综合精品| 加勒比在线一区| 日本高清一二三区| 性欧美ⅴideo另类hd| 日本精品一二区| 蜜桃a∨噜噜一区二区三区| 精品美女永久免费视频| 成人黄色片视频网站| 在线免费观看黄| 高清欧美精品xxxxx在线看| 成人在线国产| 91免费视频播放| 亚洲影院久久精品| 亚洲一区二区精品| 青青草偷拍视频| 日本精品一区| 免费看欧美女人艹b| 女人床在线观看| 欧美日韩一本到| 国产精品偷伦免费视频观看的| а√在线中文网新版地址在线| 亚洲字幕成人中文在线观看| 成人爽a毛片免费啪啪动漫| 欧美高清在线视频观看不卡| 懂色一区二区三区av片| 91婷婷韩国| 人人九九精品| 日韩成人av在线播放| 欧美日韩综合精品| 91精品国产高清久久久久久91裸体| 亚洲视频在线网| 青青草伊人久久| 亚洲在线视频| 精品国产无码在线观看| 久久久视频精品| 色一区二区三区四区| 一区二区三区日韩欧美| 欧美艳星介绍134位艳星| 欧美又粗又大又爽| www浪潮av99com| 都市激情国产精品| 国产成人精品久久一区二区小说| 亚洲欧美视频在线| 性做久久久久久久久久| 男人天堂网在线| jizzjizzjizz国产| 亚洲欧美日本另类| 美女黄色成人网| 国产真实老熟女无套内射| 国产三级三级三级精品8ⅰ区| 国内精品一区二区| 青青草精品在线| 免费观看成年人视频在线观看| 亚洲日本在线a| 91浏览器在线视频| 亚洲精品乱码久久| 91黄色免费网站| 91丨九色丨蝌蚪丨老版| 亚洲成年人电影网站| 日韩一区在线视频| 九一成人免费视频| 色狠狠色噜噜噜综合网| 午夜日韩视频| 26uuu国产日韩综合| 精品久久蜜桃| 久久亚洲国产| 亚洲女人的天堂| 色94色欧美sute亚洲线路二| 久久久久久久久久久久| 精品三级久久| 国产真实乱人偷精品视频| 神马久久久久| 久久国产精品99久久久久久老狼| 91精品国产一区二区三区动漫| 欧美人与性囗牲恔配| 国产精品丝袜在线播放| 亚洲经典一区| 一个人在线视频免费观看www| 国产jjizz一区二区三区视频| 91在线看视频| 亚洲精品高清国产一线久久| 性高潮免费视频| 日产精品高清视频免费| 久久久久久久综合狠狠综合| 中文字幕 欧美日韩| 国产视频911| 国产高清视频色在线www| 91精品在线影院| 美女毛片一区二区三区四区最新中文字幕亚洲| 日韩一区中文字幕| 成人免费高清在线观看| 熟女人妇 成熟妇女系列视频| 日本一二三四高清不卡| 中文字幕一区二区三区日韩精品| 国产视频在线观看一区二区| 后进极品白嫩翘臀在线视频| 欧美国产欧美亚洲国产日韩mv天天看完整| chinesemodel无套啪啪| 国产喷水theporn| 狠狠综合久久av一区二区小说|