久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

ASP.NET Core按用戶等級授權的方法

瀏覽:677日期:2022-06-09 08:34:49

驗證和授權是兩個獨立但又存在聯系的過程。驗證是檢查訪問者的合法性,授權是校驗訪問者有沒有權限查看資源。它們之間的聯系——先驗證再授權。

貫穿這兩過程的是叫 Claim 的東東,可以叫它“聲明”。沒什么神秘的,就是由兩個字符串組成的對象,一曰 type,一曰 value。type 和 value 有著映射關系,類似字典結構的 key 和 value。Claim 用來收集用戶相關信息,比如

UserName = adminAge = 105Birth = 1990,4,12Address = 火星街130號

ClaimTypes 靜態類定義了一些標準的 type 值。如用戶名Name,國家Country,手機號MobilePhone,家庭電話HomePhone 等等。你也可以自己定義一個,反正就是個字符串。

另外,還有一個ClaimValueTypes 輔助類,也是一組字符串,用于描述 value 的類型。如Integer、HexBinary、String、DnsName 等。其實所有 value 都是用字符串表示的,ValueTypes 只是基于內容本身的含義而定義的分類,在查找和分析 Claim 時有輔助作用。比如,值是 “00:15:30”,可以認為其 ValueType 是 Time,這樣在分析這些數據時可以方便一些。

一般,代碼會在 Sign in 前收集這些用戶信息。作用是為后面的授權做準備。授權時會對這些用戶信息進行綜合評估,以決定該用戶是否有能力訪問某些資源。

回到本文主題。本文的重點是說授權,老周的想法是根據用戶的等級來授權。比如,用戶A的等級是2,如果某個URL要求4級以上的用戶才能訪問,那么A就無權訪問了。

為了簡單,老周就不建數據庫這么復雜的東西了,直接寫個類就好了。

public class User{    public string? UserName { get; set; }    public string? Password { get; set; }    /// <summary>    /// 用戶等級,1-5    /// </summary>    public int Level { get; set; } = 1;}

上面類中,Level 屬性表示的是用戶等級。然后,用下面的代碼來產生一些用戶數據。

public static class UserDatas{    internal static readonly IEnumerable<User> UserList = new User[]    {new(){UserName="admin", Password="123456", Level=5},new(){UserName="kitty", Password="112211", Level=3},new(){UserName="bob",Password="215215", Level=2},new(){UserName="billy", Password="886600", Level=1}    };    // 獲取所有用戶    public static IEnumerable<User> GetUsers() => UserList;    // 根據用戶名和密碼校對后返回的用戶實體    public static User? CheckUser(string username, string passwd)    {return UserList.FirstOrDefault(u => u.UserName!.Equals(username, StringComparison.OrdinalIgnoreCase) && u.Password == passwd);    }}

這樣的功能,對于咱們今天要說的內容,已經夠用了。

關于驗證,這里不是重點。所以老周用最簡單的方案——Cookie。

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(opt =>{    opt.LoginPath = "/UserLog";    opt.LogoutPath = "/Logout";    opt.AccessDeniedPath = "/Denied";    opt.Cookie.Name = "ck_auth_ent";    opt.ReturnUrlParameter = "backUrl";});

這個驗證方案是結合 Session 和 Cookie 來完成的,也是Web身份驗證的經典方案了。上述代碼中我配置了一些選項:

LoginPath——當 SessionID 和 Cookie 驗證不成功時,自動轉到些路徑,要求用戶登錄。

LogoutPath——退出登錄(注銷)時的路徑。

AccessDeniedPath——訪問被拒絕后轉到的路徑。

ReturnUrlParameter——回調URL,就是驗證失敗后會轉到登錄URL,然后會在URL參數中加一個回調URL。這個選項就是配置這個參數的名稱的。比如這里我配置為backUrl。假如我要訪問/home,但是,驗證失敗,跳轉到 /UserLog 登錄,這時候會在URL后面加上 /UserLog?backUrl=/home。如果登錄成功且驗證也成功了,就會跳轉回 backUrl指定的路徑(/home)。

這里要注意的是,我們不能把要求輸入用戶名和密碼作為驗證過程。驗證由內置的CookieAuthenticationHandler 類去處理,它只驗證 Session 和 Cookie 中的數據是否匹配,而不是檢查用戶名/密碼對不對。你想想,如果把檢查用戶名和密碼作為驗證過程,那豈不是每次都要讓用戶去輸入一次?說不定每訪問一個URL都要驗證一次的,那用戶不累死?所以,輸入用戶名/密碼登錄只在 LoginPath 選項中配置,只在必要時輸入一次,然后配合 session 和 cookie 把狀態記錄下來,下次再訪問,只驗證此狀態即可,不用再輸入了。

LogoutPath 和AccessDeniedPath 我就不弄太復雜了,直接這樣就完事。

app.MapGet("/Denied", () => "訪問被拒絕");app.MapGet("/Logout", async (HttpContext context) =>{    await context.SignOutAsync();});

對于 LoginPath,我用一個 Razor Pages 來處理。

@page@using MyApp@using Microsoft.AspNetCore.Authentication@using Microsoft.AspNetCore.Authentication.Cookies@using System.Security.Claims@addTagHelper *,Microsoft.AspNetCore.Mvc.TagHelpers<form method="post">    <style>label{    display:inline-block;    min-width:100px;}    </style>    <div><label for="userName">用戶名:</label><input type="text" name="userName" />    </div>    <div><label for="passWord">密碼:</label><input type="password" name="passWord" />    </div>    <div><button type="submit">登入</button>    </div></form>@functions{    //[IgnoreAntiforgeryToken]    public async void OnPost(string userName, string passWord)    {var u = UserDatas.CheckUser(userName, passWord);if(u != null){    Claim[] cs = new Claim[]    {new Claim(ClaimTypes.Name, u.UserName!),new Claim("level", u.Level.ToString())  //注意這里,收集重要情報    };    ClaimsIdentity id = new(cs, CookieAuthenticationDefaults.AuthenticationScheme);    ClaimsPrincipal p = new(id);    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, p);    //HttpContext.Response.Redirect("/");}    }}

其他的各位可以不關注,重點是 OnPost 方法,首先用剛才寫的UserDatas.CheckUser 靜態方法來驗證用戶名和密碼(這個是要我們自己寫代碼來完成的,CookieAuthenticationHandler 可不負責這個)。用戶名和密碼正確后,咱們就要收集信息了。收集啥呢?這個要根據你稍后在授權時要用到什么來決定的。就拿今天的主題來講,我們需要知道用戶等級,所以要收集 Level 屬性的值。這里 ClaimType 我直接用“level”,Value 就是 Level 屬性的值。

收集完用戶信息后,要匯總到ClaimsPrincipal 對象中,隨后調用HttpContext.SignInAsync 擴展方法,會觸發CookieAuthenticationHandler 去保存狀態,因為它實現了IAuthenticationSignInHandler 接口,從而帶有SignInAsync 方法。

var ticket = new AuthenticationTicket(signInContext.Principal!, signInContext.Properties, signInContext.Scheme.Name);    // 保存 Session   if (Options.SessionStore != null)   {       if (_sessionKey != null)       {   // Renew the ticket in cases of multiple requests see: https://github.com/dotnet/aspnetcore/issues/22135   await Options.SessionStore.RenewAsync(_sessionKey, ticket, Context, Context.RequestAborted);       }       else       {   _sessionKey = await Options.SessionStore.StoreAsync(ticket, Context, Context.RequestAborted);       }       var principal = new ClaimsPrincipal(   new ClaimsIdentity(       new[] { new Claim(SessionIdClaim, _sessionKey, ClaimValueTypes.String, Options.ClaimsIssuer) },       Options.ClaimsIssuer));       ticket = new AuthenticationTicket(principal, null, Scheme.Name);   }  // 生成加密后的 Cookie 值   var cookieValue = Options.TicketDataFormat.Protect(ticket, GetTlsTokenBinding());    // 追加 Cookie 到響應消息中   Options.CookieManager.AppendResponseCookie(       Context,       Options.Cookie.Name!,       cookieValue,       signInContext.CookieOptions); ……

----------------------------------------------------------------------------------------

好了,上面的都是周邊工作,下面我們來干正事。

授權大體上分為兩種模式:

1、基于角色授權。即“你是誰就給你相應的權限”。你是狼人嗎?你是預言家嗎?你是女巫嗎?你是好人嗎?是狼人就賦予你殺人的權限。

2、基于策略。老周覺得這個靈活性高一點(純個人看法)。一個策略需要一定數量的約束條件,是否賦予用戶權限就看他能否滿足這些約束條件了。約束實現IAuthorizationRequirement 接口。這個接口未包含任何成員,因此你可以自由發揮了。

這只不過是按用途來劃分的,若從類型本質上看,就是一堆IAuthorizationRequirement 組合起來提供給了AuthorizationHandlerContext,AuthorizationHandlerContext 再通過一堆IAuthorizationHandler 來處理。最后由IAuthorizationEvaluator 去總結授權的結果。

這里咱們需要的約束條件是用戶等級,所以,咱們實現一個LevelAuthorizationRequirement。

public class LevelAuthorizationRequirement : IAuthorizationRequirement {     public int Level { get; private set; }     public LevelAuthorizationRequirement(int lv)     { Level = lv;     } }

授權處理有兩個接口:

1、IAuthorizationHandler:處理過程,一個授權請求可以執行多個IAuthorizationHandler。一般用于授權過程中的某個階段(或針對某個約束條件)。一個授權請求可以由多IAuthorizationHandler 參與處理。

2、IAuthorizationEvaluator:綜合評估是否決定授權。評估一般在各種IAuthorizationHandler 之后進行收尾工作。所以只執行一次就可以了,用于總結整個授權過程的情況得出最終結論(放權還是不放權)。

ASP.NET Core 內置了DefaultAuthorizationEvaluator,這是默認實現,如無特殊需求,我們不會重新實現。

public class DefaultAuthorizationEvaluator : IAuthorizationEvaluator{    public AuthorizationResult Evaluate(AuthorizationHandlerContext context)=> context.HasSucceeded    ? AuthorizationResult.Success()    : AuthorizationResult.Failed(context.HasFailed? AuthorizationFailure.Failed(context.FailureReasons): AuthorizationFailure.Failed(context.PendingRequirements));}

所以,咱們的代碼可以選擇實現一個抽象類:AuthorizationHandler<TRequirement>,其中,TRequirement 需要實現IAuthorizationRequirement 接口。這個抽象類已經滿足咱們的需求了。

public class LevelAuthorizationHandler : AuthorizationHandler<LevelAuthorizationRequirement>{    // 策略名稱,寫成常量方便使用    public const string POLICY_NAME = "Level";    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, LevelAuthorizationRequirement requirement)    {// 查找聲明Claim? clm = context.User.Claims.FirstOrDefault(c => c.Type == "level");if(clm != null){    // 讀出用戶等級    int lv = int.Parse(clm.Value);    // 看看用戶等級是否滿足條件    if(lv >= requirement.Level)    {// 滿足,標記此階段允許授權context.Succeed(requirement);    }}return Task.CompletedTask;    }}

在授權請求啟動時,AuthorizationHandlerContext (上下文)對象會把所有IAuthorizationRequirement 對象添加到一個哈希表中(HashSet<T>),表示一大串正等著授權處理的約束條件。

當我們調用 Succeed 方法時,會把已滿足要求的IAuthorizationRequirement 傳遞給方法參數。在 Success 方法內部會從哈希表中刪除此IAuthorizationRequirement,以表示該條件已滿足了,不必再證。

public virtual void Succeed(IAuthorizationRequirement requirement){    _succeedCalled = true;    _pendingRequirements.Remove(requirement);}

記得要在服務容器中注冊,否則咱們寫的 Handler 是不起作用的。

builder.Services.AddSingleton<IAuthorizationHandler, LevelAuthorizationHandler>();

builder.Services.AddSingleton<IAuthorizationHandler, LevelAuthorizationHandler>();builder.Services.AddAuthorizationBuilder().AddPolicy(LevelAuthorizationHandler.POLICY_NAME, pb =>{    pb.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);    pb.AddRequirements(new LevelAuthorizationRequirement(3));});

策略的名稱我們前面以常量的方式定義了,記得否?

  public const string POLICY_NAME = "Level";

AddAuthenticationSchemes 是把此授權策略與一個驗證方案關聯,當進行鑒權時順便做一次驗證。上述代碼我們關聯 Cookie 驗證即可,這個在文章前面已經設置了。AddRequirements 方法添加我們自定義的約束條件,這里我設置的用戶等級是 3 —— 用戶等級要 >= 3 才允許訪問。

下面寫個 MVC 控制器來檢驗一下是否能正確授權。

public class HomeController : Controller{    [HttpGet("/")]    [Authorize(Policy = LevelAuthorizationHandler.POLICY_NAME)]    public IActionResult Index()    {return View();    }}

這里咱們用基于策略的授權方式,所以[Authorize]特性要指定策略名稱。

好,運行。本來是訪問根目錄 / 的,但由于驗證不通過,自動跳到登錄頁了。

注意URL上的 backUrl 參數:?backUrl=/。本來要訪問 / 的,所以登錄后再跳回 / 。我們選一個用戶等級為 5 的登錄。

由于用戶等級為 5,是 >=3 的存在,所以授權通過。

現在,把名為 ck_auth_ent 的Cookie刪除。

這個 ck_auth_ent 是在代碼中配置的,還記得嗎?

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(opt =>{    opt.LoginPath = "/UserLog";    opt.LogoutPath = "/Logout";    opt.AccessDeniedPath = "/Denied";    opt.Cookie.Name = "ck_auth_ent";    opt.ReturnUrlParameter = "backUrl";});

現在咱們找個用戶等級低于 3 的登錄。

登錄后被拒絕訪問。

到此為止,好像、貌似、似乎已大功告成了。但是,老周又發現問題了:如果我一個控制器內或不同控制器之間有的操作方法要讓用戶等級 3 以上的用戶訪問,有些操作方法只要等級在 2 以上的用戶就可以訪問。這該咋整呢?有大伙伴可以會說了,那就多弄幾個策略,每個策略代表一個等級。

builder.Services.AddAuthorizationBuilder()    .AddPolicy("Level3", pb =>    {pb.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);pb.AddRequirements(new LevelAuthorizationRequirement(3));    })    .AddPolicy("Level5", pb =>    {pb.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);pb.AddRequirements(new LevelAuthorizationRequirement(5));    });

是的,這樣確實是可行的。不過不夠動態,要是我弄個策略從 Level1 到 Level10 呢,豈不要寫十個?

官方有個用 Age 生成授權策略的示例讓老周獲得了靈感——是的,咱們就是要動態生成授權策略。需要用到一個接口:IAuthorizationPolicyProvider。這個接口可以根據策略名稱返回授權策略,所以,咱們可以拿它做文章。

public class LevelAuthorizationPolicyProvider : IAuthorizationPolicyProvider{    private readonly AuthorizationOptions _options;    public LevelAuthorizationPolicyProvider(IOptions<AuthorizationOptions> opt)    {_options = opt.Value;    }    public Task<AuthorizationPolicy> GetDefaultPolicyAsync()    {return Task.FromResult(_options.DefaultPolicy);    }    public Task<AuthorizationPolicy?> GetFallbackPolicyAsync()    {return Task.FromResult(_options.FallbackPolicy);    }    public Task<AuthorizationPolicy?> GetPolicyAsync(string policyName)    {if(policyName.StartsWith(LevelAuthorizationHandler.POLICY_NAME,StringComparison.OrdinalIgnoreCase)){    // 比如,策略名 Level4,得到等級4    // 提取名稱最后的數字    int prefixLen = LevelAuthorizationHandler.POLICY_NAME.Length;    if(int.TryParse(policyName.Substring(prefixLen), out int level))    {// 動態生成策略AuthorizationPolicyBuilder plcyBd = new AuthorizationPolicyBuilder();plcyBd.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);plcyBd.AddRequirements(new LevelAuthorizationRequirement(level));// Build 方法生成策略return Task.FromResult(plcyBd.Build())!;    }}// 未處理,交由選項類去返回默認的策略return Task.FromResult(_options.GetPolicy(policyName));    }}

這樣可以根據給定的策略名稱,生成與用戶等級相關的配置。例如,名稱“Level3”,就是等級3;“Level5”就是等級5。

于是,在配置服務容器時,我們不再需要AddAuthorizationBuilder 一大段代碼了,直接把LevelAuthorizationPolicyProvider 注冊一下就行了。

builder.Services.AddSingleton<IAuthorizationHandler, LevelAuthorizationHandler>();builder.Services.AddTransient<IAuthorizationPolicyProvider, LevelAuthorizationPolicyProvider>();builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(opt =>……

然后,在MVC控制器上咱們就可以666地玩了。

public class HomeController : Controller {     [HttpGet("/")]     [Authorize(Policy = $"{LevelAuthorizationHandler.POLICY_NAME}3")]     public IActionResult Index()     { return View();     }     [HttpGet("/music")]     [Authorize(Policy = $"{LevelAuthorizationHandler.POLICY_NAME}2")]     public IActionResult Foo() => Content("2星級用戶擾民音樂俱樂部");     [HttpGet("/movie")]     [Authorize(Policy = $"{LevelAuthorizationHandler.POLICY_NAME}5")]     public IActionResult Movies() => Content("5星級鬼畜影院"); }

這樣一來,配置不同等級的授權就方便多了。

到此這篇關于ASP.NET Core按用戶等級授權的文章就介紹到這了,更多相關ASP.NET Core授權內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: ASP.NET
主站蜘蛛池模板: 亚洲狠狠 | 久久久久久久久久久久91 | 国产小视频在线看 | 精品久久久久久久久久久院品网 | 中文字幕亚洲一区二区三区 | 中文字幕一区二区三区乱码图片 | 播放一级黄色片 | 91一区在线 | 亚洲一区二区三区免费观看 | 久久久久久久久一区二区三区 | 欧美视频精品在线观看 | 国产成人免费视频网站视频社区 | 日韩一区二区三区在线观看 | 久久国产精品视频 | 天天操天天碰 | 97久久久| 日本黄网站在线观看 | 亚洲二区在线 | 久久国产精彩视频 | 欧美a在线 | 97影院在线午夜 | 国产精品一区二区三区在线播放 | 亚洲精品视频在线 | 亚洲国产一区二区在线观看 | 午夜影视| 精品久久久久久久久久 | 91传媒在线播放 | 欧美自拍视频 | 色噜噜色综合 | 成人看片在线观看 | 亚洲精品乱码久久久久久国产主播 | 日本一区二区三区在线视频 | a√天堂资源在线 | 国产激情综合五月久久 | 久久久www成人免费无遮挡大片 | 久在线| 日韩国产精品一区二区 | 国产91av视频在线观看 | 国产伦精品一区二区三区四区视频 | 久久精品123 | 黄色一级影视 | 精品人成| 亚洲免费网站在线观看 | 91亚洲在线 | 久久久精品欧美 | 亚洲日本中文 | 国产一区二区三区在线免费观看 | 亚洲视频三区 | 欧美色视 | 日本免费一区二区视频 | 日本一级在线观看 | 欧美日韩一区二区三区在线观看 | 国产乱码精品一区二区三 | 国产99久久 | 成人av免费在线 | 日日干,天天干 | 久久亚洲精品视频 | 久久成人国产 | 亚洲精品电影网在线观看 | 午夜视频网 | 二区视频 | 日韩视频中文字幕 | 国产成人精品在线观看 | 亚洲欧美自拍视频 | 国产xxxx成人精品免费视频频 | 久久国内精品 | 亚洲国产婷婷香蕉久久久久久99 | 在线视频a| 青青草视频网站 | 午夜视频在线观看网站 | 亚洲国产精品久久久久秋霞蜜臀 | 国产一区日韩在线 | 色综合久久久久 | 国产免费一区二区 | 91视频一区二区 | 在线观看国产wwwa级羞羞视频 | 欧美精品第一页 | 婷婷综合五月 | 国产精品毛片在线 | 国产精品1区2区 | 国产综合精品一区二区三区 | 在线观看免费黄色 | 欧美一级电影免费观看 | 精品久久国产老人久久综合 | 最新国产中文字幕 | 亚洲精品电影在线观看 | 美女毛片 | 国产激情一区二区三区成人免费 | 久久伊99综合婷婷久久伊 | 亚洲国产一区二区三区 | 欧美精品一区二区三区在线 | 欧美精品一区二区三区在线四季 | av在线日韩| 欧美日韩一区二区三区四区 | 成人黄色片网站 | av免费网站在线观看 | 久久99精品久久久久久琪琪 | 黄网站免费在线观看 | 国产精品久久久久久久久久东京 | 2020国产在线 | 亚洲a在线播放 | 狠狠色狠狠色合久久伊人 | 久久久精品网 | 国产69精品久久久久观看黑料 | 综合av第一页 | 亚洲精品二区 | 91在线视频免费观看 | 久久久久久久久久久久91 | 久久亚洲一区 | 欧美精品成人 | 精品日韩在线 | 国产高清一级毛片在线不卡 | 久久xxx| 日本超碰 | 中文字幕在线免费视频 | 黄色av网站在线观看 | 亚洲成人高清 | 色婷婷av一区二区三区软件 | 国产91在线播放精品91 | 欧美亚洲二区 | 毛片免费在线 | 精品国产91亚洲一区二区三区www | 91精品久久久久久久91蜜桃 | 国产精品久久久久久久一区探花 | 亚洲在线视频 | 91污在线| 久操草 | 国产电影一区二区 | www国产成人免费观看视频 | 91资源在线 | 国产视频福利在线 | 99成人| 国产成人精品a视频一区www | 国产 日韩 一区 | 精品无码久久久久国产 | 一区二区三区在线 | 欧 | 国产激情在线视频 | jizz在线观看 | 国产精品视频播放 | 怡红院免费在线视频 | 欧美一区 | 欧美高清视频一区 | 久久亚洲精品中文字幕 | 亚洲久久久 | 依人成人综合网 | 国产黄色大片免费看 | 日韩免费视频中文字幕 | 日日操av| 福利视频网站 | 黄色一级大片在线免费看产 | 免费二区 | 久久九 | 精品久久一区二区三区 | 波多野结衣 一区二区三区 精品精品久久 | 亚洲一区二区三区爽爽爽爽爽 | 亚洲日本乱码在线观看 | 午夜影院在线观看视频 | 日日爽 | 国产欧美综合一区二区三区 | 欧美视频区 | 欧美一级毛片日韩一级 | 国产精选久久 | 亚洲第一区国产精品 | 欧美激情久久久 | 午夜免费| 欧美成人一区二区三区片免费 | 日韩网站免费观看 | 成人在线视频免费观看 | 久操视频在线 | 久久99精品久久久久久久青青日本 | 久草免费在线 | 欧美黑人一级毛片 | 国产精品久久久久久一区二区三区 | 99国内精品久久久久久久 | 91在线视频 | 亚洲丶国产丶欧美一区二区三区 | 亚洲国产精品久久久久久 | 天天操操 | 色婷婷导航 | 精品国产不卡一区二区三区 | 国产精品乱码一区二区三区 | 精品美女久久久 | 亚洲精品一区二区三区蜜桃久 | 夜本色| 小情侣高清国产在线播放 | 亚洲精品国产setv | 国产精品久久嫩一区二区 免费 | 成人黄色片在线观看 | 国产午夜精品久久 | 国产在线不卡 | 97久久久| 免费视频久久 | 国产亚洲精品久久久 | 伊人青青久久 | 亚洲一区二区在线播放 | av中文字幕第一页 | 天天操夜夜操av | 久久精品一区二区 | 久久无码精品一区二区三区 | 一区二区日韩欧美 | 久久首页| 99在线精品视频 | 国产高清视频在线 | 亚洲精品久久久久久久久久久 | 色视频久久| 国产高潮在线观看 | 欧洲成人在线观看 | 伊人精品视频 | 欧美成a | 中文字幕日韩在线 | 欧洲亚洲精品久久久久 | 成人国产综合 | 2020亚洲视频 | 日本黄色一级 | 后进极品白嫩翘臀在线视频 | 亚洲精品在线视频观看 | 99亚洲| 欧美一区不卡 | 成人免费视频网站在线观看 | 一级片av| 久久99精品久久久久蜜臀 | 玖草av| 三区视频| 国产激情偷乱视频一区二区三区 | 精品成人免费一区二区在线播放 | 久久久久久久成人 | 亚洲视频在线看 | 久久精品国产清自在天天线 | 国产精品成人一区二区三区夜夜夜 | 在线观看亚洲一区二区 | 91精品久久久久久久久久 | avhd101在线成人播放 | 欧美一级小视频 | 小草av | 欧美涩涩网站 | 久久久综合色 | 亚洲一区在线观看视频 | 91精品国产综合久久久久久丝袜 | 午夜精品网站 | 一区中文字幕 | 久热中文| 色橹橹欧美在线观看视频高清 | 成人亚洲精品777777大片 | 国产精品久久久久精 | 日韩精品在线播放 | 99精品一区二区三区 | 黄毛片网站 | 国产精品色一区二区三区 | 国产日韩亚洲欧美 | 日韩欧美精品一区二区三区 | 91porn在线| 日韩一区二区在线观看 | 午夜激情在线 | 国产精品日产欧美久久久久 | 欧美中文字幕在线观看 | 狠狠操综合网 | 蜜桃av在线播放 | 九色在线观看 | 99精品欧美一区二区三区综合在线 | 欧美黑人一级爽快片淫片高清 | 精品久久久久久 | 中文字幕 在线观看 | 蜜臀精品久久久久久蜜臀 | 亚洲第一免费网站 | 欧美午夜一区二区福利视频 | 日韩成人影院 | 亚洲精品久久久久久下一站 | 欧美怡红院视频一区二区三区 | 999这里只有精品 | 午夜资源| 中文字幕亚洲精品 | 国产高清精品一区 | 中文字幕一区日韩精品欧美 | 国产欧美日韩精品一区 | 成人免费小视频 | 欧美一级片免费播放 | 久久久久久亚洲精品 | 国产九九九 | 综合五月网| 成人国产精品一级毛片视频 | 日本妇人成熟免费视频 | 亚洲色图p | 日韩视频在线播放 | 一级一片免费看 | 日本在线一区二区三区 | 美女超碰在线 | 国产丝袜一区二区三区免费视频 | 欧美成人在线网站 | www.久久 | 情一色一乱一欲一区二区 | 欧美成人福利 | 精品久久一二三区 | 一区二区日韩 | 国产日韩精品一区二区 | 欧美在线一区二区 | 青青草久草| 成人免费视频网 | 香蕉视频一级片 | 欧美日韩成人在线播放 | 久久精品亚洲 | 亚洲婷婷综合网 | 日韩乱码中文字幕 | 久久伊| 91久久久久久久久 | 成人精品视频免费 | 日韩欧美在线免费观看 | 成人av教育 | 色天天综合网 | 日日干天天操 | 一级a性色生活片久久毛片 夜夜视频 | 亚洲免费视频大全 | 黄色小视频在线观看 | 亚洲精品在线看 | 超碰激情 | 久草精品在线 | 亚洲一区二区在线播放 | 国产精品久久久久久久浪潮网站 | 播放一级黄色片 | 曰批视频在线观看 | 欧美大片一区二区 | 日本久久二区 | 日韩成人高清 | 欧美精品一级二级 | 亚洲精品91 | 中文字幕91 | 国产色播av在线 | 中文字幕一区二区三区四区 | 久久免费国产精品 | 在线观看免费视频a | 成人免费一区二区三区视频软件 | 后进极品白嫩翘臀在线视频 | 亚洲97 | 国产女人免费看a级丨片 | 久久精品二区 | 精品国产乱码久久久久久1区2区 | 超碰国产一区 | 亚洲精品久久久一区二区三区 | 可以免费看黄的网站 | 精品一区二区三区国产 | 精品国产乱码久久久久久1区2区 | 永久av | 精品在线一区二区 | 欧美日韩久久精品 | 一区在线视频 | 亚洲视频一区二区三区 | 国产亚洲欧美在线 | 成人午夜免费视频 | 亚洲成av| 久久精品这里只有精品 | 国产人成免费视频 | 一区二区三区视频免费在线观看 | 精品视频一区二区三区 | 成人欧美一区二区三区视频xxx | 婷婷天堂| 国产精品综合久久 | 97久久久 | 日b片| 久久影视精品 | 国产黄视频在线 | 日韩6699人妻熟女毛片 | 亚洲日本中文 | 日韩精品在线播放 | 免费的污网站 | 成人av播放| 午夜免费福利电影 | 久久久久久久久99精品 | 国产一区二区在线播放 | 日韩在线| 天天干天天操 | 国产成人免费视频 | 中文字幕av一区二区 | 亚洲视频精品在线 | 色婷婷av久久久久久久 | 成人xxx| 国产成人精品一区二区三区四区 | 久久99国产精品久久99果冻传媒 | 久久伊 | av国产精品 | 亚洲视频一区二区三区四区 | 九色精品 | 日韩精品1区2区3区 成人黄页在线观看 | 中文字幕乱码一区二区三区 | 欧美a在线 | 青青草国产在线 | 成人1区| 精品久久久久久亚洲综合网站 | 国产精品久久久久久久久久 | 日韩欧美在线视频观看 | 欧美日韩一区二区在线播放 | 艹逼网 | 中文字幕亚洲二区 | 国产真实乱全部视频 | 日本久久艹 | 欧美高清视频一区二区三区 | 色综合激情 | 国产91免费在线 | 在线观看亚洲a | 亚洲一级淫片 | 午夜小视频在线观看 | 欧美一区二区三区视频在线观看 | 日韩欧美国产网站 | 野狼在线社区2017入口 | 综合色九九 | 啪啪网站免费 | 成人免费高清视频 | 一道本一区二区三区 | 精品无码久久久久国产 | 黄色a在线观看 | 午夜欧美一区二区三区在线播放 | 一本色道精品久久一区二区三区 | 人人干天天干 | 亚洲欧美一级久久精品 | 欧美自拍视频一区 | 欧美精品福利 | 精品久久久久久亚洲精品 | 国产xnxx| 99九九久久 | 91一区二区在线观看 | 成人精品视频在线观看 | 亚洲国产二区三区 | 亚洲国产精品一区 | 四色成人av永久网址 | 91精品国产欧美一区二区 | 成人看片免费网站 | 亚洲中午字幕 | 国产中文字幕在线观看 | 91视频大全 | 伊人一区 | 国产高清精 | 夜夜草视频 | 国产欧美日本 | 日韩久久久一区二区 | 久久香蕉国产 | 亚洲精品一区二区三区在线 | 久久久久久国产精品mv | 国产中文在线 | 国产精品久久久久久久久久大牛 | 日本不卡一区二区 | 99爱视频| 日韩欧美一区二区三区 | 久久久精品一区 | 中文字幕日韩欧美一区二区三区 | 一区精品视频 | 成人高清视频在线观看 | 在线观看的av | 亚洲一区二区高清视频 | 热久久免费视频 | 精品三级在线观看 | 欧美色视 | 亚洲精品午夜国产va久久成人 | 亚洲自拍偷拍欧美 | 国产九九九 | 国产午夜精品美女视频明星a级 | 日韩久久一区 | 欧美性v| 精品午夜久久 | 亚洲欧美日韩另类精品一区二区三区 | 日韩中文在线播放 | 国产精品一区在线观看 | 羞羞午夜 | 91爱爱视频 | 国产精品福利在线观看 | 国产毛片一区二区 | 天天拍天天干天天操 | wwwjizz日本 | 成人在线网址 | av综合在线观看 | 国产综合精品一区二区三区 | 91污在线观看 | 久久99精品视频 | 精品影院| 欧美性猛交一区二区三区精品 | 久久网站免费视频 | 午夜精品一区二区三区免费视频 | 日韩中文字幕在线 | 日韩精品一区二区三区在线播放 | 亚洲一区二区三区视频 | 中文二区 | 国产精品资源在线 | 午夜久久久久 | 亚洲视频在线观看一区二区三区 | 色综合99| 在线观看国产视频 | 亚洲成人免费影院 | 色花av | 欧洲一区在线 | 国产专区一区二区三区 | 国产成人精品在线观看 | 欧美日韩一区二区三区在线观看 | 视频在线一区 | 久久久久高清 | 91av久久 | 簧片免费网站 | 国产高清在线精品一区二区三区 | 国外成人在线视频网站 | 日本三级电影天堂 | 亚洲综合天堂网 | 国产精品久久久久久久久久大牛 | 狠狠色狠狠色合久久伊人 | 亚洲精品久久久久久久久久久 | 日韩在线一区二区三区 | 一级毛片免费看 | 欧美性生活视频 | 日韩中文字幕一区二区高清99 | 国产成人在线网站 | 欧美激情精品一区 | 成人在线播放器 | 免费av在线| √8天堂资源地址中文在线 成人欧美一区二区三区白人 | 精品91在线 | 不卡在线 | 一级毛片免费播放 | 免费亚洲婷婷 | 亚洲一区二区视频在线播放 | 精品久久国产 | vagaa欧洲色爽免影院 | 毛片在线视频 | 天天夜夜操 | 天天色天天色 | 亚洲不卡视频 | 国内精品一区二区三区 | 国产精品69久久久久水密桃 | 日韩久久午夜一级啪啪 | 久久人人爽人人爽 | 成人精品视频在线观看 | 久在线| 成年无码av片在线 | 久久综合久久久 | 99视频只有精品 | 亚洲不卡在线 | 欧美日韩美女 | 亚洲精品久久久蜜臀 | 91亚洲国产成人久久精品网站 | av免费网站 | 欧美一级在线 | 丁香五月网久久综合 | 免费在线看a | 国产在线观看一区二区三区 | 午夜资源| 91中文在线 | 国产一区二区亚洲 | 嫩草视频入口 | 欧美黄视频 | 不卡的免费av | 天天射日日操 | 成人免费视频网站在线观看 | 九色视频在线播放 | 日韩av一区二区三区在线观看 | 欧美一区二区三区免费 | 6080夜射猫 | 精品国产鲁一鲁一区二区在线观看 | 亚欧洲精品视频在线观看 | 91久久91久久精品免观看 | 97视频精品 | 国产精品久久九九 | 蜜桃视频麻豆女神沈芯语免费观看 | 日韩亚洲视频在线观看 | 夜夜操天天干 | 波多野结衣亚洲 | 久久精品亚洲 | 黄色国产| 男人的天堂在线视频 | 天堂资源最新在线 | 欧美视频第一页 | 日韩高清国产一区在线 | 女人久久久久久久 | 久久女同互慰一区二区三区 | 中文字幕 国产精品 | 日干夜操 | 91精品国产综合久久久蜜臀粉嫩 | 国产在线观看一区二区 | 在线色网站| av自拍 | 99精品久久久久久久免费 | 午夜精品一区二区三区免费视频 | 国产欧美一区二区精品性色 | 久久91av| 日韩av一区二区三区在线 | 欧美日韩精品一区二区 | 免费看特级毛片 | 天天干夜夜操 | 日韩亚洲| 国产96在线观看 | 亚洲黄色片免费 | 日日夜夜草| 欧美一级片免费观看 | 国产免费av在线 | 激情综合网五月婷婷 | 欧美精品免费在线 | 亚洲一区成人在线观看 | 欧美在线影院 | 91小视频 | 精品一区二区三区中文字幕 | 亚洲国产视频一区 | 精品一区二区三区在线观看视频 | 免费xxxx大片国产在线 | 亚洲国产精品免费 | 久久99精品久久久久久琪琪 | 天天曰天天干 | 精品电影| 婷婷在线视频 | 日本久久久久久久 | 综合色婷婷一区二区亚洲欧美国产 | 女朋友的闺蜜3韩国三级 | 毛片毛片毛片 | 日韩精品观看 | 欧美精品一区二区三区蜜桃视频 | 亚洲性生活免费视频 | 精品伊人久久 | 欧美精品欧美精品系列 | 中文字幕 国产精品 | 国产成人在线视频 | 国产亚洲精品一区二区 | 欧美日韩精品一区二区三区四区 | 亚洲精品一区二区三区 |