精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Web API之認證(Authentication)兩種實現(xiàn)方式

移動開發(fā)
對于所謂的認證說到底就是安全問題,在Web API中有多種方式來實現(xiàn)安全,【accepted】方式來處理基于IIS的安全(通過上節(jié)提到的WindowsIdentity依賴于HttpContext和IIS認證)或者在Web API里通過使用Web API中的消息處理機制,但是如果我們想應(yīng)用程序運行在IIS之外此時Windows Idenitity這一方式似乎就不太可能了,同時在Web API中本身就未提供如何處理認證的直接方式,我們不得不自定義來實現(xiàn)認證功能,同時這也是我們所推薦的方式,自己動手,豐衣足食。

序言

對于所謂的認證說到底就是安全問題,在Web API中有多種方式來實現(xiàn)安全,【accepted】方式來處理基于IIS的安全(通過上節(jié)提到的WindowsIdentity依賴于HttpContext和IIS認證)或者在Web API里通過使用Web API中的消息處理機制,但是如果我們想應(yīng)用程序運行在IIS之外此時Windows Idenitity這一方式似乎就不太可能了,同時在Web API中本身就未提供如何處理認證的直接方式,我們不得不自定義來實現(xiàn)認證功能,同時這也是我們所推薦的方式,自己動手,豐衣足食。
溫馨提示:下面實現(xiàn)方法皆基于基礎(chǔ)認證,若不熟悉Http協(xié)議中的Basic基礎(chǔ)認證,請先參看此篇文章【園友海鳥-介紹Basic基礎(chǔ)認證和Diges摘要認證】。


無論何種方式,對于我們的應(yīng)用程序我們都需要在業(yè)務(wù)層使用基于憑證的用戶認證,因為是客戶端一方的需求,所以客戶端需要明確基礎(chǔ)驗證,基礎(chǔ)認證(Basic)非常簡單并且支持任何Web客戶端,但是基礎(chǔ)驗證的缺點是不安全,通過使用SSL則可以進行加密就可以在一定程度上保證了安全,如果是對于一般的應(yīng)用程序通過基礎(chǔ)認證只是進行編碼而未加密也可以說是安全的。我們還是看看上一節(jié)所給圖片

通過上述圖片的粗略信息我們可以看出在請求到Action方法之間要經(jīng)過Web API消息處理管道,在請求到目標元素之前要經(jīng)過HttpMessageHandler和認證過濾器,所以我們可以通過這兩者來自定義實現(xiàn)認證。下面我們一一來看。
基于Web API的認證過濾器(AuthorizationFilterAttribute)實現(xiàn)認證
***步

我們自定義一個認證身份(用戶名和密碼)的類,那么此類必須也就要繼承于 GenericIdentity ,既然是基于基礎(chǔ)驗證,那么類型當(dāng)然也就是Basic了。

  1. public class BasicAuthenticationIdentity : GenericIdentity 
  2. public string Password { get; set; } 
  3. public BasicAuthenticationIdentity(string name, string password) 
  4. : base(name, "Basic"
  5. this.Password = password; 


第二步

我們要自定義一個認證過濾器特性,并繼承 AuthorizationFilterAttribute ,此時會變成如下:

  1. public class BasicAuthenticationFilter : AuthorizationFilterAttribute 
  2. public override void OnAuthorization(HttpActionContext actionContext) 
  3. {} 

那么在這個重寫的方法我們應(yīng)該寫什么呢?我們慢慢來分析!請往下看。

解析請求報文頭

首先對于客戶單發(fā)送過來的請求我們肯定是需要獲得請求報頭,然后解析請求報頭中的Authorization,若此時其參數(shù)為空,我們將返回到客戶端,并發(fā)起質(zhì)詢。

 

  1.  string authParameter = null
  2.  
  3. var authValue = actionContext.Request.Headers.Authorization; //actionContext:Action方法請求上下文 
  4. if (authValue != null && authValue.Scheme == "Basic"
  5. authParameter = authValue.Parameter; //authparameter:獲取請求中經(jīng)過Base64編碼的(用戶:密碼) 
  6.  
  7. if (string.IsNullOrEmpty(authParameter)) 
  8.  
  9. return null
次之,若此時認證中的參數(shù)不為空并開始對其進行編碼,并返回一個BasicAuthenticationIdentity對象,若此時對象為空,則同樣返回到客戶端,并發(fā)起質(zhì)詢
  1. uthParameter = Encoding.Default.GetString(Convert.FromBase64String(authParameter)); //對編碼的參數(shù)進行解碼 
  2.  
  3. var authToken = authParameter.Split(':'); //解碼后的參數(shù)格式為(用戶名:密碼)將其進行分割 
  4. if (authToken.Length < 2
  5. return null
  6.  
  7. return new BasicAuthenticationIdentity(authToken[0], authToken[1]); //將分割的用戶名和密碼傳遞給此類構(gòu)造函數(shù)進行初始化 


***,我們將上述兩者封裝為一個ParseHeader方法以便進行調(diào)用

  1.  public virtual BasicAuthenticationIdentity ParseHeader(HttpActionContext actionContext) 
  2. string authParameter = null
  3.  
  4. var authValue = actionContext.Request.Headers.Authorization; 
  5. if (authValue != null && authValue.Scheme == "Basic"
  6. authParameter = authValue.Parameter; 
  7.  
  8. if (string.IsNullOrEmpty(authParameter)) 
  9.  
  10. return null
  11.  
  12. authParameter = Encoding.Default.GetString(Convert.FromBase64String(authParameter)); 
  13.  
  14. var authToken = authParameter.Split(':'); 
  15. if (authToken.Length < 2
  16. return null
  17.  
  18. return new BasicAuthenticationIdentity(authToken[0], authToken[1]); 

接下來我們將認證未通過而需要發(fā)起認證質(zhì)詢,我們將其封裝為一個方法Challenge

  1. void Challenge(HttpActionContext actionContext) 
  2. var host = actionContext.Request.RequestUri.DnsSafeHost; 
  3. actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); 
  4. actionContext.Response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", host)); 
  5.  

定義一個方法便于對用戶名和密碼進行校驗,并將其修飾為虛方法,以免后續(xù)要添加其他有關(guān)用戶數(shù)

  1.  public virtual bool OnAuthorize(string userName, string userPassword, HttpActionContext actionContext) 
  2. if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(userPassword)) 
  3.  
  4. return false
  5. else 
  6. return true
  7.  

在認證成功后將認證身份設(shè)置給當(dāng)前線程中Principal屬性

  1. ar principal = new GenericPrincipal(identity, null); 
  2.  
  3. Thread.CurrentPrincipal = principal; 
  4.  
  5. //下面是針對ASP.NET而設(shè)置 
  6. //if (HttpContext.Current != null) 
  7. // HttpContext.Current.User = principal; 


第三步

一切已經(jīng)就緒,此時在重寫方法中進行相應(yīng)的調(diào)用即可,如下:

  1.  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] 
  2. public class BasicAuthenticationFilter : AuthorizationFilterAttribute 
  3. public override void OnAuthorization(HttpActionContext actionContext) 
  4. var userIdentity = ParseHeader(actionContext); 
  5. if (userIdentity == null
  6. Challenge(actionContext); 
  7. return
  8.  
  9. if (!OnAuthorize(userIdentity.Name, userIdentity.Password, actionContext)) 
  10. Challenge(actionContext); 
  11. return
  12.  
  13. var principal = new GenericPrincipal(userIdentity, null); 
  14.  
  15. Thread.CurrentPrincipal = principal; 
  16.  
  17. base.OnAuthorization(actionContext); 

 #p#


第四步

自定義 CustomBasicAuthenticationFilter 并繼承于 BasicAuthenticationFilter ,重寫其虛方法。

  1.  public class CustomBasicAuthenticationFilter : BasicAuthenticationFilter 
  2. public override bool OnAuthorize(string userName, string userPassword, HttpActionContext actionContext) 
  3. if (userName == "xpy0928" && userPassword == "cnblogs"
  4.  
  5. return true
  6. else 
  7. return false
  8.  


***一步

注冊自定義認證特性并進行調(diào)用

  1.  config.Filters.Add(new CustomBasicAuthenticationFilter()); 
  2.  
  3. [CustomBasicAuthenticationFilter] 
  4. public class ProductController : ApiController 
  5. {....} 

至此對于其認證方式就已經(jīng)完全實現(xiàn),接下來我們通過【搜狗瀏覽器】來驗收我們的成果。

看到如下認證其用戶名和密碼的圖片,我們知道我們成功了一半

我們點擊取消,觀察是否返回401并添加質(zhì)詢頭即WWW-Authenticate,如我們所料

我們輸入正確的用戶名和密碼再試試看,結(jié)果認證成功,如下:

基于Web API的消息處理管道(HttpMessageHandler)實現(xiàn)認證

我們知道HttpMessageHandler是Web API中請求-響應(yīng)中的消息處理管道的重要角色,但是真正實現(xiàn)管道串聯(lián)的是DelegatingHandler,若你不懂Web API消息管道,請參考前面系列文章,所以我們可以自定義管道來進行攔截通過繼承DelegatingHandler。下面我們一步步來實現(xiàn)基于此管道的認證。
***步

和***種方法一致不再敘述。
第二步

這一步當(dāng)然是自定義管道進行處理并繼承DelegatingHandler,重載在此類中的SendAsync方法,通過獲得其請求并處理從而進行響應(yīng),若不懂此類中的具體實現(xiàn),請參看前面系列文章。

同樣是我們需要根據(jù)請求來解析請求報頭,我們依然需要解析報頭方法,但是需要稍作修改

 

  1.  public virtual BasicAuthenticationIdentity ParseHeader(HttpRequestMessage requestMessage) 
  2. string authParameter = null
  3.  
  4. var authValue = requestMessage.Headers.Authorization; 
  5. if (authValue != null && authValue.Scheme == "Basic"
  6. authParameter = authValue.Parameter; 
  7.  
  8. if (string.IsNullOrEmpty(authParameter)) 
  9.  
  10. return null
  11.  
  12. authParameter = Encoding.Default.GetString(Convert.FromBase64String(authParameter)); 
  13.  
  14. var authToken = authParameter.Split(':'); 
  15. if (authToken.Length < 2
  16. return null
  17.  
  18. return new BasicAuthenticationIdentity(authToken[0], authToken[1]); 

此時質(zhì)詢也得作相應(yīng)的修改,因為此時不再是依賴于Action請求上下文,而是請求(HttpRequestMessage)和響應(yīng)(HttpResponseMessage)

 

  1.  void Challenge(HttpRequestMessage request,HttpResponseMessage response) 
  2. var host = request.RequestUri.DnsSafeHost; 
  3.  
  4. response.Headers.Add(authenticationHeader, string.Format("Basic realm=\"{0}\"", host)); 
  5.  
  6. }

最終繼承自DelegatingHandler的代碼如

 

  1.  public class BasicAuthenticationHandler : DelegatingHandler 
  2. private const string authenticationHeader = "WWW-Authenticate"
  3. protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
  4. var crendentials = ParseHeader(request); 
  5.  
  6. if (crendentials != null
  7. var identity = new BasicAuthenticationIdentity(crendentials.Name, crendentials.Password); 
  8.  
  9. var principal = new GenericPrincipal(identity, null); 
  10.  
  11. Thread.CurrentPrincipal = principal; 
  12.  
  13. //針對于ASP.NET設(shè)置 
  14. //if (HttpContext.Current != null) 
  15. // HttpContext.Current.User = principal; 
  16.  
  17. return base.SendAsync(request, cancellationToken).ContinueWith(task => { 
  18. var response = task.Result; 
  19. if (crendentials == null && response.StatusCode == HttpStatusCode.Unauthorized) 
  20. Challenge(request, response); 
  21.  
  22. return response; 
  23. }); 
  24.  
  25.  
  26. void Challenge(HttpRequestMessage request,HttpResponseMessage response) 
  27. var host = request.RequestUri.DnsSafeHost; 
  28.  
  29. response.Headers.Add(authenticationHeader, string.Format("Basic realm=\"{0}\"", host)); 
  30.  
  31.  
  32. public virtual BasicAuthenticationIdentity ParseHeader(HttpRequestMessage requestMessage) 
  33. string authParameter = null
  34.  
  35. var authValue = requestMessage.Headers.Authorization; 
  36. if (authValue != null && authValue.Scheme == "Basic"
  37. authParameter = authValue.Parameter; 
  38.  
  39. if (string.IsNullOrEmpty(authParameter)) 
  40.  
  41. return null
  42.  
  43. authParameter = Encoding.Default.GetString(Convert.FromBase64String(authParameter)); 
  44.  
  45. var authToken = authParameter.Split(':'); 
  46. if (authToken.Length < 2
  47. return null
  48.  
  49. return new BasicAuthenticationIdentity(authToken[0], authToken[1]); 

#p#
第三步

上述我們自定義的BasicAuthenticationFilter此時就得繼承 AuthorizeAttribute 該特性也是繼承于上述的 AuthorizationFilterAttribute ,我們需要利用AuthorizeAttribute中的 IsAuthorized 方法來驗證當(dāng)前線程中的Principal是否已經(jīng)被授權(quán)。
 

 

  1.  public class BasicAuthenticationFilter : AuthorizeAttribute 
  2. protected override bool IsAuthorized(HttpActionContext actionContext) 
  3.  
  4. var identity = Thread.CurrentPrincipal.Identity; 
  5. if (identity != null && HttpContext.Current != null
  6. identity = HttpContext.Current.User.Identity; 
  7.  
  8. if (identity != null && identity.IsAuthenticated) 
  9.  
  10. var basicAuthIdentity = identity as BasicAuthenticationIdentity; 
  11.  
  12. //可以添加其他需要的業(yè)務(wù)邏輯驗證代碼 
  13. if (basicAuthIdentity.Name == "xpy0928" && basicAuthIdentity.Password == "cnblogs"
  14. return true
  15.  
  16. return false
  17.  

通過 IsAuthorized 方法返回值來看,若為false,則返回401狀態(tài)碼,此時會觸發(fā) BasicAuthenticationHandler 中的質(zhì)詢,并且此方法里面主要是我們需要添加認證用戶的業(yè)務(wù)邏輯代碼。同時我們也說過我們***種方法自定義實現(xiàn)的過濾器特性是 AuthorizationFilterAttribute (如果我們有更多邏輯使用這個特性是個不錯的選擇),而在這里是 AuthorizeAttribute (對于驗證用戶并且返回bool值使用此過濾器特性是個不錯的選擇)。
第四步

注冊自定義管道以及認證過濾器特性

  1. config.MessageHandlers.Add(new BasicAuthenticationHandler()); 
  2. config.Filters.Add(new BasicAuthenticationFilter()); 

***一步

[BasicAuthenticationFilter]
public class ProductController : ApiController
{.....}

下面我們通過【360極速瀏覽器】來驗收成果。點擊按鈕直接請求控制器

接下來取消,是否返回401

至此***結(jié)束。
總結(jié)
用認證特性(AuthorizationFilterAttribute)還是HttpMessageHandler實現(xiàn)認證,這是一個問題?
通過比較這二者的實現(xiàn)操作在實現(xiàn)方式上明顯有極大的不同,個人覺得用AuthorizationFilterAttribute來實現(xiàn)認證是更加簡單并且緊湊,因為實現(xiàn)的每一處都在每一個地方,在大多數(shù)實現(xiàn)自定義登陸的場景下,對于用過濾器如此緊湊的業(yè)務(wù)邏輯用這個更加高效, 用HttpMessageHandler的優(yōu)點是全局應(yīng)用且是Web API消息處理管道的一部分,如果對于不同的部分要用不同的認證那么用HttpMessageHandler效果更好,但是此時你需要自定義一個過濾器,尤其是當(dāng)MessageHandler對于一個認證需要一個過濾器的時候。所以綜上所述,根據(jù)不同的應(yīng)用場景我們應(yīng)該選擇對應(yīng)的方式來實現(xiàn)認證。

責(zé)任編輯:chenqingxiang 來源: xpy0928的博客
相關(guān)推薦

2023-03-29 13:06:36

2024-04-28 18:28:12

API文檔生成工具開發(fā)Web API

2010-07-14 10:30:26

Perl多線程

2011-03-03 10:26:04

Pureftpd

2022-06-08 15:12:34

前端前端截圖

2021-12-08 10:47:35

RabbitMQ 實現(xiàn)延遲

2009-04-03 09:00:20

SQL Server2005用戶

2010-09-28 15:12:27

Javascript

2009-06-15 15:02:48

Spring定時器

2024-01-09 09:09:45

RESTGraphQL

2010-09-07 11:09:59

2023-05-31 19:10:31

2020-05-11 13:03:03

SR-TEIP路由器

2010-07-13 14:54:15

Perl面向?qū)ο缶幊?/a>

2024-12-19 00:12:02

APIJSON數(shù)據(jù)

2009-06-25 13:43:00

Buffalo AJA

2010-10-21 16:24:18

sql server升

2010-02-02 14:32:32

Python線程編程

2021-05-27 10:57:01

TCP定時器網(wǎng)絡(luò)協(xié)議

2021-10-19 10:56:00

插件工程方式
點贊
收藏

51CTO技術(shù)棧公眾號

成人免费视频91| 超碰97人人人人人蜜桃| 日本女人性生活视频| 国产一区二区三区国产精品| 午夜欧美视频在线观看| 欧美一区二区三区电影在线观看| 亚洲综合五月天婷婷丁香| 欧美激情综合色综合啪啪| 亚洲美女中文字幕| 免费成人黄色大片| 永久免费毛片在线播放| 亚洲三级在线观看| 欧美lavv| 国产成人三级在线播放| 久久先锋资源| 久久久精品一区二区| 波多野结衣福利| 麻豆精品国产| 欧美综合一区二区| av日韩一区二区三区| 欧美jizz18性欧美| 久久―日本道色综合久久| 91在线无精精品一区二区| 无码人妻丰满熟妇精品区| 欧美激情一级片一区二区| 中文字幕av日韩| 日本护士做爰视频| 免费看日产一区二区三区| 91久久精品国产91性色tv | 国产一级二级av| 日韩一区二区三区在线免费观看| 亚洲永久免费av| 亚洲一区二区三区午夜| 黄色在线小视频| 成人动漫一区二区| 91在线高清视频| 青青艹在线观看| 在线视频精品| 久久久久日韩精品久久久男男| 亚洲无人区码一码二码三码的含义| 99久久婷婷国产综合精品青牛牛| 91麻豆精品国产91| 精品久久久久久久无码| 涩涩视频在线播放| 亚洲国产裸拍裸体视频在线观看乱了| 综合网五月天| 日韩理伦片在线| 国产精品免费免费| 亚洲va韩国va欧美va精四季| 福利片在线观看| 久久综合狠狠综合久久综合88| 国产成人av一区二区三区| 国产人妻精品一区二区三区| 精品亚洲欧美一区| 国产啪精品视频| 亚洲无码久久久久| 激情综合色综合久久| 国产剧情久久久久久| 伊人精品在线视频| 经典三级在线一区| 成人羞羞国产免费| 国产乱淫a∨片免费视频| 精品一区二区三区免费视频| 成人激情免费在线| 国产chinasex对白videos麻豆| 国内精品伊人久久久久av一坑| 国产日本欧美一区二区三区在线| 91 中文字幕| 国产一区二区影院| 99视频国产精品免费观看| 亚洲国产视频一区二区三区| 成人午夜伦理影院| 国产一区自拍视频| 黄网在线观看| 日韩一区中文字幕| 日本国产中文字幕| 狠狠躁少妇一区二区三区| 欧美视频二区36p| 美女黄色片视频| 亚洲精品大片| 精品粉嫩aⅴ一区二区三区四区| 国产精品成人无码专区| 免费av一区| 少妇高潮久久久久久潘金莲| 波多野结衣家庭教师| 影院欧美亚洲| 国产精品国产亚洲伊人久久| 99热这里只有精品9| 不卡欧美aaaaa| 欧美一区二区三区精美影视 | 久久精品一区二| 日韩午夜视频在线| 亚洲第一精品夜夜躁人人爽| 久久久久久九九九九九| 国产精品福利在线观看播放| 国内精品久久久久久影视8| 日本免费在线观看视频| 韩国成人福利片在线播放| 国产专区一区二区| 999国产在线视频| 亚洲午夜一区二区三区| 97公开免费视频| 日韩三级精品| 在线观看日韩欧美| 国产一级在线观看视频| 男女性色大片免费观看一区二区 | 久久婷婷国产91天堂综合精品| 伊人国产精品| 国产丝袜一区二区三区免费视频| 中文字幕在线2021| 天堂久久一区二区三区| 97netav| 成人免费黄色网页| 亚洲成av人片一区二区三区| 中文字幕av不卡在线| 亚洲v天堂v手机在线| 九九热在线精品视频| 国产情侣免费视频| 97久久人人超碰| 青青草综合在线| 色综合视频一区二区三区日韩| 精品无人区太爽高潮在线播放| 九九久久免费视频| 国产在线精品一区二区不卡了| 欧美日韩国产三区| 狠狠操一区二区三区| 精品日韩av一区二区| 中日韩一级黄色片| 蜜臂av日日欢夜夜爽一区| 免费在线观看一区二区| 136福利第一导航国产在线| 日韩亚洲电影在线| 日韩三级在线观看视频| 蜜桃免费网站一区二区三区| 欧美久久久久久一卡四| 国产99在线| 亚洲白拍色综合图区| 精品爆乳一区二区三区无码av| 狠狠狠色丁香婷婷综合激情| 一级做a爰片久久| 国产精品第一国产精品| 一级做a爰片久久毛片美女图片| 欧美一区二区三区网站| 91免费观看国产| 狠狠爱免费视频| 香蕉久久夜色精品国产更新时间| 91av在线播放| 五月天激情开心网| 日韩欧美精品在线观看| 毛茸茸多毛bbb毛多视频| 亚洲国产裸拍裸体视频在线观看乱了中文| 97超级碰碰| 美女91在线| 亚洲成人精品视频| 日韩精品一区二区三| caoporn国产精品| 波多野结衣乳巨码无在线| 开心激情综合| 日本免费久久高清视频| 久久国产精品高清一区二区三区| 色综合天天在线| 欧美人妻一区二区三区| 免费成人av资源网| 在线无限看免费粉色视频| 精品国产麻豆| 久久久免费高清电视剧观看| | 亚洲激情一二三区| 久草免费资源站| 国产精品视频| 亚洲一区二区三区乱码| 免费一级欧美在线大片| 久久久久久久久电影| 无套内谢的新婚少妇国语播放| 91久久线看在观草草青青| 国精产品久拍自产在线网站| 国产精品亚洲一区二区三区妖精 | 战狼4完整免费观看在线播放版| 久久99国产精品麻豆| 国产freexxxx性播放麻豆| 亚洲尤物av| 成人免费在线网址| 暧暧视频在线免费观看| 国产一区二区三区在线观看视频| 国产精品视频在线观看免费| 亚洲一级片在线观看| 国产一区二区三区精品在线| 国产精品69毛片高清亚洲| 久久久一本二本三本| 日韩av专区| 国产精品一码二码三码在线| 成人网ww555视频免费看| 另类视频在线观看| 国产在线黄色| 欧美成人bangbros| 午夜视频网站在线观看| 亚洲图片欧美综合| 成年人在线免费看片| 成人少妇影院yyyy| 亚洲一级免费观看| 亚洲精品精选| 国产精品无码乱伦| 五月天亚洲色图| 51成人做爰www免费看网站| videos性欧美另类高清| 免费不卡在线观看av| 国产日本在线观看| 欧美精品一区二区在线播放| 中文字幕制服诱惑| 欧美日韩亚洲天堂| 久久久久亚洲天堂| 国产精品国产三级国产专播品爱网| 国产精品手机在线观看| 国内精品写真在线观看| 日韩一级在线免费观看| 国产一区视频在线观看免费| 亚洲高清乱码| 国产亚洲一卡2卡3卡4卡新区 | 亚洲精品视频观看| 精品伦精品一区二区三区视频密桃| 成人av在线资源网| 手机在线播放av| 精品制服美女丁香| 日韩在线第三页| 亚洲综合电影一区二区三区| 免费高清一区二区三区| 中文字幕日韩一区二区不卡| 午夜一区二区三区| 久久av导航| 久久艳妇乳肉豪妇荡乳av| 精品人人人人| 国产日韩精品推荐| caoporn成人免费视频在线| 亚洲综合中文字幕在线| 色综合一区二区日本韩国亚洲| 国产成人在线精品| 国模冰冰炮一区二区| 91成人在线视频| 欧美日韩在线观看首页| 91国产美女视频| av今日在线| 91chinesevideo永久地址| 9lporm自拍视频区在线| 欧美精品久久久久久久免费观看| 免费男女羞羞的视频网站在线观看| 久久夜精品香蕉| 超碰在线caoporn| 波霸ol色综合久久| 国产素人视频在线观看| 欧美成人性色生活仑片| 青草在线视频| 97免费中文视频在线观看| 色多多在线观看| 国产成人亚洲综合青青| 精品无人乱码一区二区三区 | 久久精品国产sm调教网站演员| 韩日精品视频| 久久久久久久久久久99| 国产精品综合| 污视频免费在线观看网站| 美腿丝袜亚洲色图| 中文字幕日韩久久| 国产69精品久久久久777| 漂亮人妻被黑人久久精品| 91在线视频观看| 鲁丝一区二区三区| 中文字幕一区二区日韩精品绯色| 成人免费精品动漫网站| 亚洲国产精品影院| 欧美男人亚洲天堂| 欧美日韩高清影院| 亚洲欧美另类一区| 亚洲女人天堂色在线7777| 天堂中文8资源在线8| 欧美区二区三区| 中文不卡1区2区3区| 国产在线一区二区三区| 成人在线tv视频| 欧美极品视频一区二区三区| 欧美高清在线| 国产人妻777人伦精品hd| 久久综合婷婷| 久久久久亚洲av片无码v| 91亚洲精品久久久蜜桃| 女人裸体性做爰全过| 洋洋av久久久久久久一区| caoporn国产| 91精品在线观看入口| 色呦呦中文字幕| 久久精品小视频| 午夜影视一区二区三区| 国产在线拍偷自揄拍精品| 色婷婷精品视频| 女同性恋一区二区| 久久久国产亚洲精品| 精品人妻无码中文字幕18禁| 久久精品网站免费观看| 欧美成人三级在线观看| 日本高清视频一区二区| 成人福利小视频| 少妇高潮久久77777| 无遮挡爽大片在线观看视频| 91久久夜色精品国产网站| 羞羞色国产精品网站| 欧美做受777cos| 日韩电影网1区2区| 中文字幕天堂网| **性色生活片久久毛片| 亚洲第一区av| 亚洲欧美国产日韩天堂区| 日本在线观看大片免费视频| 国产精品久久久久久久久久三级| 精品嫩草影院| 色婷婷777777仙踪林| 奇米影视在线99精品| 精品少妇一区二区三区免费观| 亚洲一区在线观看免费| 国产免费av电影| 中文字幕久久亚洲| 在线最新版中文在线| 国产一区免费在线| 激情亚洲网站| 欧洲成人午夜精品无码区久久| 国产精品久久久99| 69视频免费看| 亚洲精品视频免费在线观看| 国产盗摄精品一区二区酒店| 亚洲已满18点击进入在线看片 | 亚洲国产91视频| 亚洲狠狠婷婷综合久久久| 日韩中文字幕区一区有砖一区| 中文字幕一区二区人妻电影丶| 一区二区三区日韩精品| 国产美女精品视频国产| 播播国产欧美激情| 日日夜夜一区| 中文字幕日韩精品久久| 久久成人av少妇免费| 国产精品白丝喷水在线观看| 欧美日韩精品三区| 91在线网址| 国产九九精品视频| 国产精品久久占久久| 欧美美女一级片| 1000精品久久久久久久久| 国产一区二区麻豆| 久久久精品国产| 一区二区在线免费播放| 国产精品自拍合集| 成人91在线观看| 五月婷婷开心网| 精品视频久久久久久久| 欧美特黄aaaaaaaa大片| 人偷久久久久久久偷女厕| 日韩avvvv在线播放| 成人欧美一区二区三区黑人一| 欧美日韩精品欧美日韩精品一综合| 香蕉视频在线免费看| 成人免费看片视频| 国产一在线精品一区在线观看| 欧美xxxx黑人| 午夜欧美在线一二页| 户外极限露出调教在线视频| 国产精品视频播放| 亚洲综合中文| 欧亚乱熟女一区二区在线| 日韩欧美中文在线| 五月天婷婷在线视频| eeuss一区二区三区| 亚洲人成毛片在线播放女女| 四虎国产精品成人免费入口| 欧美日韩精品欧美日韩精品一综合| av在线免费网站| 久久国产精品 国产精品| 日韩精品电影在线观看| 外国一级黄色片| 亚洲国产精品久久久久秋霞蜜臀 | 不卡视频一区二区三区| 亚洲一区自拍| 99久久久无码国产精品不卡| 欧美成人福利视频| 欧美日韩免费看片| 99精品视频网站| 99re这里都是精品| 依依成人在线视频| 欧美—级a级欧美特级ar全黄| 曰本一区二区三区视频| 欧美大片久久久| 午夜视频一区在线观看| 天天影视久久综合| 久久精品日产第一区二区三区 | аⅴ资源新版在线天堂| 147欧美人体大胆444| 日韩国产欧美在线视频| 毛片a片免费观看| 国产亚洲日本欧美韩国| 91在线一区| 亚洲欧美久久久久| 精品久久久久久中文字幕| 蜜桃视频网站在线|