精品欧美一区二区三区在线观看 _久久久久国色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综合精品门事件在线| 欧美美女黄视频| 国产精品国产亚洲精品看不卡| 噜噜噜在线观看播放视频| 精品一区二区三区香蕉蜜桃 | 国产精品免费看一区二区三区| 在线天堂中文字幕| 性xxxx欧美老肥妇牲乱| 日韩av影视在线| 婷婷激情小说网| 日韩电影网站| 亚洲影视在线播放| 亚洲美女网站18| 亚洲人在线观看视频| 精品写真视频在线观看| 7777免费精品视频| 丰满少妇高潮久久三区| 成人羞羞网站入口| 日韩黄色av网站| 中文字幕av一区二区三区人妻少妇 | 影音先锋国产在线| 亚洲欧美高清| 欧美寡妇偷汉性猛交| 中国美女黄色一级片| 夜色77av精品影院| 精品国产欧美一区二区| 天天影视色综合| 日韩av超清在线观看| 亚洲国产精品精华液网站| 中文字幕中文字幕一区三区| 蜜桃视频在线免费| www.久久久久久久久| 91在线视频导航| 中文字幕在线视频第一页| 欧美亚洲一区二区三区| 久久久免费精品| 欧美国产日韩综合| 亚洲国产一成人久久精品| 中文字幕精品av| 一级片视频免费看| 午夜精品福利影院| 亚洲国产另类 国产精品国产免费| 成人高清在线观看视频| 国产精品777777在线播放| 欧美日韩一区二区三区四区| 激情婷婷综合网| 亚洲精品一级二级| 色哟哟一区二区在线观看| av网站在线观看不卡| av人人综合网| 激情久久av一区av二区av三区| 中文精品无码中文字幕无码专区| 呦呦在线视频| 亚洲一区二三区| 无码人妻少妇伦在线电影| 不卡av免费观看| 午夜不卡在线视频| 欧美黄色免费影院| 日韩精选视频| 欧美群妇大交群中文字幕| 99国产精品久久久久久| 久久av偷拍| 精品国产青草久久久久福利| 亚洲天堂成人av| 欧美极品在线观看| xvideos国产精品| 欧美第一页在线观看| 欧美黄免费看| 97国产一区二区精品久久呦 | 欧美日韩在线播放一区| 91女神在线观看| 欧美视频三区| 亚洲电影天堂av| 免费成人蒂法网站| 成久久久网站| 欧美激情xxxx性bbbb| 日本少妇bbwbbw精品| 久久综合九色综合欧美狠狠| 国产精品视频男人的天堂| 国产精品爽爽久久| 成人av电影免费在线播放| 欧美尤物一区| 精品孕妇一区二区三区| 亚洲高清免费观看| 免费观看成人网| 涩涩屋成人免费视频软件| 日韩黄色高清视频| 国产三级精品三级观看| 激情婷婷亚洲| 国产成人精品免高潮费视频| 国产欧美久久久精品免费| 91亚洲精品久久久蜜桃网站| 在线视频不卡一区二区三区| 丁香花高清在线观看完整版| 欧美亚日韩国产aⅴ精品中极品| 国产成人美女视频| 日韩深夜福利| 欧美成人网在线| 免费看日批视频| 国产乱人伦偷精品视频免下载| 国产在线视频欧美一区二区三区| 欧美三级理伦电影| 欧美日韩精品二区| 精品人妻一区二区三| 国产精品手机在线播放| 久久99精品国产99久久6尤物| 久久久精品福利| 丁香婷婷深情五月亚洲| 亚洲日本精品| 日韩国产激情| 亚洲第一在线视频| 国产又黄又爽又无遮挡| 日韩精品亚洲专区| 精品一区二区三区日本| 成人高清免费在线| 欧美三级日本三级少妇99| 好吊一区二区三区视频| 狠狠爱www人成狠狠爱综合网 | 盗摄系列偷拍视频精品tp| 国产亚洲人成网站在线观看| 五月天婷婷综合网| 粉嫩av一区二区三区| 伊人久久av导航| 韩国精品视频在线观看 | 国产传媒视频在线| 亚洲影视在线| 精品999在线观看| 色呦呦在线看| 欧美xxxx老人做受| 国产激情无码一区二区三区| 日本欧美在线看| 日本午夜一区二区三区| 电影网一区二区| 日韩av综合网| 亚洲GV成人无码久久精品| av网站免费线看精品| 少妇人妻大乳在线视频| 911亚洲精品| 欧美激情欧美激情在线五月| 99在线观看免费| 亚洲精品中文字幕在线观看| 一区二区三区国产好的精华液| 日韩极品一区| 国产精品视频久久| 日韩精品黄色| 在线综合视频播放| 精品无码在线观看| 蜜臀av性久久久久av蜜臀妖精| 日韩欧美在线观看强乱免费| 日本精品裸体写真集在线观看| 亚洲女人被黑人巨大进入| 国产高清中文字幕| 国产农村妇女精品| 天天影视色综合| 午夜天堂精品久久久久| 国产99午夜精品一区二区三区| 秋霞在线午夜| 日韩高清中文字幕| 亚洲中文无码av在线| 国产精品久久毛片a| www激情五月| 亚洲激情在线| 欧美一区二区视频17c| 网友自拍亚洲| 日韩亚洲精品电影| xxxx国产精品| 欧美日韩另类在线| 精品人妻中文无码av在线| 久久99精品国产麻豆婷婷洗澡| 欧美日韩dvd| 日本精品影院| 国产精品中文字幕在线| 性欧美videos高清hd4k| 亚洲加勒比久久88色综合| 一区二区三区在线观看av| 国产精品视频在线看| 婷婷激情小说网| 国产欧美一区二区色老头 | 懂色aⅴ精品一区二区三区蜜月| 魔女鞋交玉足榨精调教| 韩国精品在线观看| 国产av国片精品| 成人婷婷网色偷偷亚洲男人的天堂| 成人写真视频福利网| 色偷偷偷在线视频播放| 久久精品国产99国产精品澳门| 狠狠躁日日躁夜夜躁av| 欧美亚洲动漫精品| 欧美一级高潮片| 欧美激情一区二区三区四区| 亚洲熟女乱综合一区二区| 免费日韩av片| avav在线播放| 久久影院一区| 久久久久成人精品免费播放动漫| 日本一区二区三区中文字幕 | 久久天天久久| 97在线观看免费| 日本免费视频在线观看| 亚洲精品久久久久久久久久久久久| 真实新婚偷拍xxxxx| 午夜电影一区二区| 日韩欧美123区| 久久久av毛片精品| 国产麻豆xxxvideo实拍| 国产一区二区女| 熟妇人妻无乱码中文字幕真矢织江| 欧美黄色aaaa| 特级毛片在线免费观看| 欧美男gay| 精品欧美一区二区久久久伦| 超碰国产精品一区二页| 国产91在线高潮白浆在线观看| av电影在线免费| 久久中文字幕在线| av在线女优影院| 亚洲欧洲一区二区三区久久| www.午夜激情| 91精品国模一区二区三区| 中文字幕一区二区三区四区欧美| 午夜伊人狠狠久久| 国产盗摄x88av| 成人免费一区二区三区视频| 中文字幕免费在线看线人动作大片| 91蜜桃在线观看| 强迫凌虐淫辱の牝奴在线观看| 国产成人免费av在线| 爽爽爽在线观看| 久久精品国产成人一区二区三区| 亚洲视频在线观看一区二区三区| 久久久久久久尹人综合网亚洲| 男女视频网站在线观看| 亚洲麻豆一区| 黄色一级在线视频| 欧美人与禽猛交乱配视频| ijzzijzzij亚洲大全| 91亚洲国产| 一级黄色录像免费看| 天天影视欧美综合在线观看| 一本色道久久综合亚洲二区三区| 欧美肉体xxxx裸体137大胆| 日本10禁啪啪无遮挡免费一区二区| 色88888久久久久久影院| 狠狠色噜噜狠狠狠狠色吗综合| 超碰在线成人| 官网99热精品| 欧美一级全黄| 欧美另类一区| 欧美日韩国产一区二区三区不卡| 日韩av不卡在线播放| 精品国产精品国产偷麻豆| 四虎影院一区二区三区| 久久人人88| 秋霞在线一区二区| 亚洲欧美综合| 成人免费aaa| 久久最新视频| 2025韩国理伦片在线观看| 久久国产精品99久久人人澡| 特级西西444www| 国产99久久久国产精品| 精品1卡二卡三卡四卡老狼| av成人动漫在线观看| 91精品国产自产| 国产精品乱人伦中文| 久久国产美女视频| 午夜av区久久| 奴色虐av一区二区三区| 欧美日韩精品免费观看视频 | 欧美性www| 91视频网页| 网友自拍一区| 午夜啪啪福利视频| 妖精视频成人观看www| jizz欧美激情18| 国产精品一区二区视频| 噜噜噜在线视频| 中文字幕制服丝袜成人av| 久久婷婷综合国产| 91久久精品网| 国产成人久久精品77777综合 | 亚洲巨乳在线| av污在线观看| www.性欧美| 永久免费看片直接| 精品久久久久久久久久久久久| 亚洲一区二区三区高清视频| 亚洲成人亚洲激情| www.久久热.com| 久久男人资源视频| 日本中文字幕一区二区| 国产精品毛片一区视频| 欧美独立站高清久久| 人妻少妇精品久久| 久久精品国产成人一区二区三区 | 97香蕉超级碰碰久久免费软件 | 波多野结依一区| 成人xvideos免费视频| 日本国产精品| 日本a级片在线播放| 日本伊人午夜精品| 亚洲精品中文字幕在线播放| 中文字幕一区在线观看视频| 99精品在线播放| 制服丝袜亚洲播放| 福利视频在线播放| 97色在线播放视频| 日韩区一区二| 一本久道久久综合| 日韩高清不卡一区二区三区| 亚洲成年人在线观看| 中文字幕在线不卡一区| 神马久久久久久久| 日韩国产在线看| 成入视频在线观看| 999在线观看免费大全电视剧| 精品久久国产| 欧美精品色婷婷五月综合| 成人一二三区视频| 妺妺窝人体色www婷婷| 51精品久久久久久久蜜臀| 久草视频在线看| 88国产精品欧美一区二区三区| 日韩中文在线| 韩国黄色一级大片| 久久精品国产亚洲aⅴ| 91视频免费在观看| 色就色 综合激情| 国产黄色片在线播放| 97avcom| 日本中文字幕在线一区| 日韩中字在线观看| 成人不卡免费av| 国产精品免费av一区二区| 亚洲缚视频在线观看| 啊啊啊久久久| 久久99热只有频精品91密拍| 国产一区二区三区久久| 一二三不卡视频| 欧美日韩一区二区在线播放| 日韩大胆人体| 国产成人在线亚洲欧美| 精品国产一区二区三区久久久樱花 | 日韩av在线导航| 涩涩视频网站在线观看| 欧美成人免费在线| 久久男女视频| 欧美黄色高清视频| 538prom精品视频线放| 午夜小视频福利在线观看| 国产精品久久久久久久久婷婷| 亚洲区欧美区| 中文字幕一二三四区| 欧美日韩在线一区二区| 免费高清完整在线观看| 99久久99久久精品国产片| 日韩午夜高潮| 扒开jk护士狂揉免费| 欧美亚一区二区| h片在线播放| 久久久一本精品99久久精品| 天堂精品中文字幕在线| 欧美aaa级片| 日韩美女视频一区二区在线观看| 欧美精品videosex| 欧美韩国日本精品一区二区三区| 日韩精品亚洲专区| 亚洲色图综合区| 亚洲国产精品一区二区久| 日本精品在线中文字幕| 国产精品av免费| av一本久道久久综合久久鬼色| 日韩免费av网站| 欧美巨猛xxxx猛交黑人97人| 日韩极品在线| 精品亚洲一区二区三区四区| 亚洲一区二区在线观看视频| 欧美美乳在线| 91精品久久久久久蜜桃| 亚洲深夜av| 欧美一区免费观看| 日韩精品视频在线免费观看| 国产精品xxx| 日本中文字幕在线视频观看| 国产拍欧美日韩视频二区| 国产视频第一页| 日本精品免费一区二区三区| 久久久久久久久丰满| 亚洲一区二区在线免费| 欧美日本一区二区三区| 国产黄大片在线观看| 亚洲AV无码成人精品一区| 99精品久久99久久久久| 国产精品久久久久久久久久久久久久久久久久| 久久噜噜噜精品国产亚洲综合|