国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

ASP.NET Core 按用戶等級授權(quán)

共 22238字,需瀏覽 45分鐘

 ·

2023-07-28 14:27


前言

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

正文

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

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

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

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

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

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

為了簡單,老周就不建數(shù)據(jù)庫這么復(fù)雜的東西了,直接寫個類就好了

public class User
{
    public string? UserName { getset; }
    public string? Password { getset; }

    /// <summary>
    /// 用戶等級,1-5
    /// </summary>
    public int Level { getset; } = 1;
}

上面類中,Level 屬性表示的是用戶等級。然后,用下面的代碼來產(chǎn)生一些用戶數(shù)據(jù)。

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;

    // 根據(jù)用戶名和密碼校對后返回的用戶實體
    public static User? CheckUser(string username, string passwd)
    {
        return UserList.FirstOrDefault(u => u.UserName!.Equals(username, StringComparison.OrdinalIgnoreCase) && u.Password == passwd);
    }
}

這樣的功能,對于咱們今天要說的內(nèi)容,已經(jīng)夠用了。

關(guān)于驗證,這里不是重點。所以老周用最簡單的方案——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";
});

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

LoginPath——當(dāng) SessionID 和 Cookie 驗證不成功時,自動轉(zhuǎn)到些路徑,要求用戶登錄。

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

AccessDeniedPath——訪問被拒絕后轉(zhuǎn)到的路徑。

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

這里要注意的是,我們不能把要求輸入用戶名和密碼作為驗證過程。驗證由內(nèi)置的 CookieAuthenticationHandler 類去處理,它只驗證 Session 和 Cookie 中的數(shù)據(jù)是否匹配,而不是檢查用戶名/密碼對不對。

你想想,如果把檢查用戶名和密碼作為驗證過程,那豈不是每次都要讓用戶去輸入一次?說不定每訪問一個URL都要驗證一次的,那用戶不累死?所以,輸入用戶名/密碼登錄只在 LoginPath 選項中配置,只在必要時輸入一次,然后配合 session 和 cookie 把狀態(tài)記錄下來,下次再訪問,只驗證此狀態(tài)即可,不用再輸入了。

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

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("/");
        }
    }
}

其他的各位可以不關(guān)注,重點是 OnPost 方法,首先用剛才寫的 UserDatas.CheckUser 靜態(tài)方法來驗證用戶名和密碼(這個是要我們自己寫代碼來完成的,CookieAuthenticationHandler 可不負責(zé)這個)。

用戶名和密碼正確后,咱們就要收集信息了。收集啥呢?這個要根據(jù)你稍后在授權(quán)時要用到什么來決定的。就拿今天的主題來講,我們需要知道用戶等級,所以要收集 Level 屬性的值。這里 ClaimType 我直接用“l(fā)evel”,Value 就是 Level 屬性的值。

收集完用戶信息后,要匯總到 ClaimsPrincipal 對象中,隨后調(diào)用 HttpContext.SignInAsync 擴展方法,會觸發(fā) CookieAuthenticationHandler 去保存狀態(tài),因為它實現(xiàn)了 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 到響應(yīng)消息中
   Options.CookieManager.AppendResponseCookie(
       Context,
       Options.Cookie.Name!,
       cookieValue,
       signInContext.CookieOptions);
 ……

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

授權(quán)大體上分為兩種模式:

1、基于角色授權(quán)。即“你是誰就給你相應(yīng)的權(quán)限”。你是狼人嗎?你是預(yù)言家嗎?你是女巫嗎?你是好人嗎?是狼人就賦予你殺人的權(quán)限。

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

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

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

public class LevelAuthorizationRequirement : IAuthorizationRequirement
{
     public int Level { getprivate set; }

     public LevelAuthorizationRequirement(int lv)
     {
         Level = lv;
     }
}

授權(quán)處理有兩個接口:

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

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

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

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));
}

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

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)
            {
                // 滿足,標記此階段允許授權(quán)
                context.Succeed(requirement);
            }
        }
        return Task.CompletedTask;
    }
}

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

當(dāng)我們調(diào)用 Succeed 方法時,會把已滿足要求的 IAuthorizationRequirement 傳遞給方法參數(shù)。在 Success 方法內(nèi)部會從哈希表中刪除此 IAuthorizationRequirement,以表示該條件已滿足了,不必再證。

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

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

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 是把此授權(quán)策略與一個驗證方案關(guān)聯(lián),當(dāng)進行鑒權(quán)時順便做一次驗證。上述代碼我們關(guān)聯(lián) Cookie 驗證即可,這個在文章前面已經(jīng)設(shè)置了。AddRequirements 方法添加我們自定義的約束條件,這里我設(shè)置的用戶等級是 3 —— 用戶等級要 >= 3 才允許訪問。

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

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

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

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

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

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

現(xiàn)在,把名為 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";
});

現(xiàn)在咱們找個用戶等級低于 3 的登錄。

登錄后被拒絕訪問。

到此為止,好像、貌似、似乎已大功告成了。但是,老周又發(fā)現(xiàn)問題了:如果我一個控制器內(nèi)或不同控制器之間有的操作方法要讓用戶等級 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));
    });

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

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

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
            // 提取名稱最后的數(shù)字
            int prefixLen = LevelAuthorizationHandler.POLICY_NAME.Length;
            if(int.TryParse(policyName.Substring(prefixLen), out int level))
            {
                // 動態(tài)生成策略
                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));
    }
}

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

于是,在配置服務(wù)容器時,我們不再需要 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星級鬼畜影院");
}

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


轉(zhuǎn)自:東邪獨孤

鏈接:cnblogs.com/newton/p/17026903.html



回復(fù) 【關(guān)閉】學(xué)永久關(guān)閉App開屏廣告
回復(fù) 【刪除】學(xué)自動檢測那個微信好友刪除、拉黑
回復(fù) 【福利】學(xué)查看微粒貸額度獲取20元微信紅包
回復(fù) 【手冊】獲取3萬字.NET、C#工程師面試手冊
回復(fù) 【幫助】獲取100+個常用的C#幫助類庫
回復(fù) 【加群】加入DotNet學(xué)習(xí)交流群


瀏覽 846
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 高潮喷水无码| 日本欧美黄色| 黄色a级毛片| 亚洲无码成人AV| 最新va在线观看| 中文字幕在线亚洲| 911精品国产一区二区在线| 综合精品7799| 国产午夜成人视频| 囯产精品久久久久久久久久久久久久| 嫩草av| 欧美一级网站| 丁香六月综合激情| 超碰九一| 日韩在线小电影| 男人天堂AV片| 麻豆中文字幕| 内射无码专区久久亚洲| 91无码人妻一区二区成人AⅤ| 日韩,变态,另类,中文,人妻| 亚洲三级视频在线播出| 欧美操逼免费视频| 婷婷色777777| 国产av激情| 欧美成人午夜| 欧美一级性爱视频| 婷婷精品免费久久| 在线观看免费黄网站| 无码孕妇| 欧美成人网站视频| 国产色婷婷| 99黄色视频| 69精品无码成人久久久久久| 十八毛片| 91看片看婬黄大片女跟女| 先锋资源日韩| 日韩av一级| 日韩美女免费性爱视频| 黄色电影免费在线观看| 欧美三P囗交做爰XXXⅩ| 国产17c精品视频一二三区| 熟女综合网| 学生妹内射| 久久久久无码国产精品一区| 国产91小视频| 免费a片观看| 日韩欧美一区二区三区不卡| www.bbbb| 五月丁香成人网| 开心深爱激情网| 亚洲中文字幕在| 国产无遮挡又黄又爽又色视频| 天堂国产一区二区三区| 欧美在线A片| 人成免费网站| 黑人Av在线| 亚洲丝袜不卡| 99成人| 国产精品成人AV在线| 三级片无码在线播放| 国产黄色小电影| 欧美性少妇| 内射无码视频| 天堂网久久| 91人人妻人人操| 青青草原国产视频| 日本99视频| 国产日韩欧美久久| 精品国产AV鲁一鲁一区| 国产一区视频在线| 特猛特黄AAAAAA片| 欧美作爱| 欧美aa片| 中文字幕免费看高清| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 欧美精品成人在线| 玖玖99视频| 免费欧美A片| 日本久久视频| 另类欧美色图| 亚洲v区| 国产无码三级| 亚洲在线第一页| 3D动漫精品一区二区在线播放免费| 国产69精品久久| 久久电影精品| 91亚洲影院| 99热在线观看者| 亚洲操逼图片| 少妇搡BBBB搡BBB搡造水多, | 成人爽a毛片一区二区免费| 中文字幕2018第一页| 久久久人妻| aaa无码| 中文字幕无码日韩| 一道本一区二区三区| 好男人WWW一区二区三区| 久久久久成人精品无码| 九九久热| 九九热av| 一级一A片一a免费看| 欧美在线v| 免费日韩视频| 在线观看免费成人网站| 国产色综合视频| 丁香婷婷五月色成人网站| 四川婬妇BBw搡BBBB搡| 影音先锋av资源网站| 精品无码人妻一区二区| 欧美日韩一区二区在线观看| 黄色视频网站在线免费观看| 中文字幕+乱码+中文字幕在线| 日韩午夜AV| 九色国产视频| 十八禁免费网站| 亚洲无码视频免费在线观看| 欧美日韩性爱视频| 中文字幕第六页| 成人黄色电影在线观看| 欧美三P囗交做爰| 婷婷射| 中文字幕在线视频观看| 人人操人人射| 91国黄色毛片在线观看| 一品国精和二品国精的文化意义| 插逼视频国产| 无码高清在线观看| 操逼观看| 麻豆人妻换人妻好紧| 国产高清视频在线观看| 国产精品视频| 亚洲性生活| 国产成人毛片18女人18精品 | www.插逼| 欧美综合婷婷| 麻豆激情视频| 婷婷色色网| 俄女兵一级婬片A片| 亚洲精品欧美| 午夜黄片| 精品人妻系列| 揉BBB搡BBB搡BBB| 国产无码性爱| 99re伊人| 69国产精品成人无码| 外国一级片| 天天射天天射| 国产精品93333333| 91爱爱网| 亚洲国产婷婷香蕉A片| 亚洲国产精品久久人人爱| 亚洲第一色网站| 日日干天天干| 北条麻妃无码在线| 欧美日本色| 午夜无码免费| 国产老女人农村HD| 在线观看亚洲一区| 精品亚洲无码视频| 麻豆成人无码精品视频| 天堂在线免费视频| 97人妻| 久草黄色电影| 99久久人妻精品免费二区| 日逼高清无码| 操逼毛片视频| 五月天AV在线| 日韩免费黄色电影| 婷婷精品| 欧美猛男的大鷄巴| 久久av一区| 欧美成人精品一区二区| 大鸡巴视频在线观看| 成人黄A片免费| 手机不卡黄色视频在线| 91网站18| 毛片中文字幕| 免费aaa| 国产精品被狂躁到高潮| 日韩视频久久| 偷拍777| 骚逼av| 三级片视频网站| 国产精品怡红院有限公司| 美国熟妇| 日本黄色免费在线观看| 久激情内射婷内射蜜桃欧美一级| 亚洲色图成人网| 国产精品久久久久久久久久久免费看 | 亚洲精品麻豆| 亚州免费视频| 99热在线免费| www.俺去也| 大吊无码| 无码在线播放视频| 九九韩剧网最新电视剧免费观看| 宗合久久| 日皮视频免费观看| 日韩人妻精品无码久久| 91视频久久| 免费在线观看视频a| 亚洲午夜福利视频在线观看| 国产成人精品一区二| 亚洲av高清无码| 99热免费在线| 亚洲无码高清视频| 中文字幕www一区| 新超碰97| 五月天激情导航| 污污污www精品国产网站| 91青青草| 星空AV| 影音先锋在线视频观看| 丁香婷婷五月色成人网站| 亚洲黄片免费观看| 韩国三级中文字幕HD久久精品 | 国产免费操逼视频| 欧美国产日韩欧美亚洲国产| 91福利影院| 中文字幕精品一区| 亚洲无码精品在线观看| 黄色av免费网站| 一道本无码视频| 欧美日韩A片欧美日| 欧美精品成人| 亚洲一级黄色电影| 波多野在线视频| 神马午夜福利影院| 91人妻人人爽人人爽| 日韩精品| 中文字幕在线播放第一页| 日本免费在线视频| 波多野结衣成人在线| 免费在线观看黄片| 亚洲视频在线免费| a√天堂中文在线8| 黄色成人视频在线免费观看| 欧美激情四射老司机| 五月丁香中文| 亚洲日韩精品在线观看| 乱伦三区| 亚洲乱码一区| 日逼网站视频| 国产无码Av| 男女爱爱动态图| aa在线| 亚洲男人天堂视频| 国产乱轮视频| h在线观看h| 影音先锋av在线资源| 无码免费一区| 日韩人妻精品无码久久边| 亚洲成人无码片| 亚洲国产高清在线观看视频| a片在线免费观看| 国内自拍激情视频| 91视频一区二区三区| 肉片无遮挡一区二区三区免费观看视频 | 午夜无码精品一区二区三区99午| 日韩成人精品| 好好的日视频| 欧美在线成人视频| 热久久免费视频| 成人黄色视频网| 亚洲无码精品一区二区三区| 日韩无码播放| 亚洲理论在线| www高清无码| 大香蕉一级片| 第四色网站| 麻豆视频一区二区三区| 中文字幕-区二区三区四区视频中国| 男女日日批黄色三级| 大肉大捧视频免费观看| 无码理论片| 欧美三级视频| 人妻HDHDHD96XXXX| 日本成人一区| 国产欧美一区二区三区视频| 成年人黄色电影| 一道本一区| 女人操逼| 成人在线超碰| 日韩三区| 翔田千里AV在线| 岛国无码破解AV在线播放| 操碰在线| 成人H动漫精品一区二区无码| 婷婷五月丁香激情| 国产又爽又黄免费视频网站| 亚洲高清无码中字| 狠狠干干| 欧美激情内射| 久色视频在线| 翔田千里珍藏版无码| 久久成人一区| 欧美成人免费A级在线观看| 欧美久久久| h成人在线| 亚洲AV无码成人| 亚洲欧美日韩黑料吃瓜在线观看| 99免费热视频在线| 79色色| 久99在线视频| 99精品色| 亚洲无码自拍| 91无码影院| 国产传媒在线| 黄色a片在线观看| 亚洲人成色777777无码| 91免费在线视频| 成人A片网| 午夜福利在线视频| 国产福利精品视频| 毛片一区二区三区| 成人黄片网| 亚洲天堂AV2025| 亚洲色人妻| 国产黄色性爱视频| 色骚爽大香蕉91| 黄片高清视频| 麻豆视频在线观看| 嫩BBB搡BBB搡BBB四川| 东京热无码免费视频| 成人婷婷五月| 欧美精品在线观看视频| jizz国产| 超碰极品| 超碰免费在线观看| 琪琪色五月天| 79色色| 激情青青草| 日韩有码电影| 无码三级AV| 国产第8页| 午夜小电影| 欧美特黄一级视频| 草逼片| 高清无码成人视频| 四虎一区| 日韩操逼av| 国产亚洲Av| 内射学生妹视频| 影音先锋蜜桃| 中国操逼| 高清无码不卡av| 人人草人人摸| 国产aaaa| 妹子干综合| 青青草中文字幕| 久久精品网| av无码精品一区| 丁香激情五月天| 大香蕉综合在线观看| 毛片久久| AV资源在线免费观看| 日韩A片无码ⅩXXXX| 欧美日韩一级二级三级| 无码福利电影| 东北骚妇大战黑人视频| 人人干人人干人人| 自慰一区| 男女视频网站| AV大片免费看| 国产特级毛片| 国产AV黄| 色婷婷18| 国产成人三级视频| 欧美亚韩一区二区三区| 女人av天堂| 蜜臀色欲AV无码人妻| 新超碰97| 国产va| 真实白嫖91探花无码| 一区二区不卡视频| 刘玥精品国产一区二区三区 | 亚洲熟妇在线观看一区二区 | 欧美日韩性爱网站| 久久久国产视频| 在线免费观看黄片| 国产一級A片免费看| 久久性爱视频| yy午夜福利| 亚州中文字幕| 久久精品综合| 91ThePorn国产在线观看| av大片在线观看| AV一区二区三区四区| 亚洲欧洲视频在线观看| 在线观看无码高清| 91密臀| 一道本无吗一区| 广州媚黑妇系列视频在线| 亚洲视频一区二区三区| 午夜福利AV在线| 91香蕉视频在线| 自拍偷拍15p| 国产一区二区免费看| 国产V在线观看| 欧美在线日韩在线| 亚洲精品456| 先锋影音资源一区| 国产精品9| 麻豆熟女| 中文字幕免费在线看一区七区| 大香久久| 一区二区成人免费视频| AV网站在线播放| 思思热免费视频| 免费a在线观看| 中文字幕视频免费| 国产熟女一区二区| 国产中文人人国际| 北条麻妃日B视频| 日韩欧美视频| 无码国产+白浆| 中文字字幕在线中文乱码更新时间| 小泽玛利亚一区二区免费| 亚洲免费视频在线看| 精品无码秘人妻一区二区三区| 久久久久久久免费无码| 亚洲有码中文字幕| 成人高清无码在线观看| JlZZJLZZJlZZ亚洲女人17| 91人人妻人人澡人人爽人人| 51国产视频| 中文字幕无码AV| 俺去俺来也www色官网黑人| 激情日逼| 欧美成人免费网站| 国产精品宾馆| 成人在线无码| 精品一区二区三区在线观看| 国产在线内射| 97人妻人人澡人人爽人人精品| 国产成人AV一区二区三区在线观看 | 肏屄视频免费观看| 亚洲中文字幕日韩精品| 肏屄视频在线观看| 中文字幕无码人妻在线视频| 国产精品视频久久久久| 国产乱伦电影| 午夜在线免费视频| 国产欧美一级片| 操小骚逼视频| 特级西西西88大胆无码| 欧美日韩午夜福利视频| 伊人久久爱| 蜜桃免费| 国产视频福利| 日韩中文字码无砖| 99精品99| 亚洲va国产va天堂va久久| 777色色色| 午夜精品久久久久久久久久久久| 中文字幕一区二区三区四区在线视频 | 无码精品人妻一区二区| 人人妻人人澡人人爽人人DVD| 大香蕉98| 国产一级特黄aaa大片| 黑人无码AV黑人天堂无码AV| 在线黄色视频网站| 天天视频色版免费观看视频| 欧美一级网站| 婷婷六月色| 高清无码学生妹| 精品人妻二区中文字幕| 婷婷成人视频| 欧美一级操| 国产免费一区二区| 人操人操人操| 欧美久久电影| 国产人妖在线| 天天日比| 嫩BBB搡BBBB搡BBBB| 爽好紧别夹喷水网站| 日韩无码123| 亚洲色成人网站www永久四虎| 东京热精品视频| 丁香五月六月婷婷| 中文在线第一页| 国产一级黄色| AAA三级片| 99久久成人| 未满十八18禁止免费无码网站| 欧美精品久久久久久久久爆乳| 亚洲欧美另类色图| 大香蕉国产精品| 久草手机视频在线观看| 9l蝌蚪PORNY中文| 婷婷色色五月天| 国产一级二级视频| 337P大胆粉嫩银噜噜噜| 国产激情综合五月久久| 视频一区二区三区在线观看| 少妇搡BBBB搡BBB搡小说| 亚洲图片激情乱伦小说| 波多野结衣成人在线| 69成人天堂无码免费| 亚洲一本色道中文无码| 大香蕉伊人视频| 免费无码在线| 天堂va欧美ⅴa亚洲va一夜| 欧美一二三区黄色免费视屏| 国产女人视频| 亚洲丁香网| 懂色AV无码中字幕一区| 黄色777| 免费视频a| 国产色视频一区二区三区QQ号| 亚洲天堂国产视频| 国产欧美欧洲| 在线视频a| 女人AV天堂| 无码福利视频| 竹菊av一区二区三区四区五区| 国产高清秘成人久久| 久久男人天堂| 大香蕉尹人视频| 日本久久播| 九七色色电影| 综合天堂AV久久久久久久| 亚洲av无码乱码| 国产乱伦内射视频| 色哟哟一区二区三区四区| 99热国产| 成人免费大香蕉| 中文有码在线| 俺去俺来也www色官网黑人| 99精品999| 性爱AV| 91视频美女模特| 91乱子伦国产乱子伦!| 日韩欧美成人视频| 亚洲av自拍| 亚洲天堂在线观看免费视频| 91青青视频| 黄色激情AV| 蕉久中文字慕| 女人的天堂AV| 丁香婷婷色| 男人天堂手机在线| 先锋影音在线| 成人无码91| 91人人妻人人| 91精彩视频| 婷婷久草网| 亚洲吹箫| a片在线免费观看| 99er热精品视频| 天天综合天天做天天综合| AV资源网站| 韩国一区二区三区| 中文字幕日本成人| 婷婷丁香五月网| 久久久无码电影| 综合五月婷婷| 午夜精品18视频国产17c| 一区二区三区免费观看| 欧美激情在线| 日韩人妻一区二区三区| 亚洲无码专区在线| 影音先锋日韩精品| 亚洲性爱一级片| 波多野结衣91| JlZZJLZZ亚洲美女18| 男女操逼视频网站| 国产丝袜自拍| 西西4444大胆无码视频| 激情网站在线| 国产秘精品区二区三区日本| 奇米av在线| 四川性BBB搡BBB爽爽爽小说 | 91狠狠色丁香婷婷综合久久| 躁BBB躁BBB躁BBBBB乃| 亚洲一级免费视频| 日本天天操| 欧美成人黄色小说| 欧美激情无码一区二区三区张丽| 粉嫩av懂色av蜜臀av熟妇| 国产做受91电影| 四川少妇bbbbbbbbb| 人人摸人人操人人射| 天天干在线观看| 嫩BX区二区三区的区别| 国产TS变态重口人妖| 大香久久| 五月丁香成人| 97人妻一区二区三区| 国产2区| 欧美手机在线视频| 欧美激情五月| a无码| 黄色无無| 污视频在线观看免费| 国产1024在线| 无码在线播放视频| 国产欧美第一页| 丰满大爆乳波霸奶| 激情婷婷丁香| 成人网站AV| 夸克看成人片一级A片| 91黄色视频在线播放| 99久久99久久精品免费看小说。 | 亚洲GV成人无码久久精品| 亚洲高清超级无码在线视频观看| 大香蕉老师| 欧美在线视频播放| 中文字幕+乱码+中文乱码电影| 国产成人精品电影| 超碰首页| 久久h| 精品视频在线观看| 久久电影无码| 国产精品AV一区| 91在线视频免费播放| 久久婷婷网站| 国产视频黄| 欧美日韩国产精品成人| 亚洲免费一区二区| 少妇无码视频| 极品美女扒开粉嫩小泬高潮一| 内射学生妹视频| 色欲一区二区三区| 插插插综合| 91无码AⅤ在线| 婷婷五月丁香花| 免费三级网址| 91sese| 九九九九九九国产| 亚洲AV无码成人精品区h麻豆| 欧美日韩婷婷| 国产一区二区三区在线观看免费视频免费视频免费视频 | 久久久人妻| www.狠狠| 高清无码免费| 男女啪啪啪| 一区二区三区四区| 中文无码熟妇人妻| 国产在线观看AV| 免费无码成人片在线观看在线| 春色Av| 欧美51精品| 北条麻妃在线一区二区| 狠狠躁18三区二区一区免费人| 日本少妇高潮| 久艹| gogogo免费高清在线偷拍 | 狼人综合网| 激情青青草| 亚洲大逼| 亚洲综合免费观看高清| 欧美性国产| 人人操人人爱人人妻| 啊v在线| 在线视频你懂得| 欧美日韩操逼片| 色播欧美| 五月涩| 波多野结衣黄色| 久久yy| 黄色片大全| 免费成人毛片| 久久精品国产亚洲AV麻豆痴男| 少妇的屄| 一区成人| 亚洲欧美日韩在线| 五月天黄色电影网站| 国产精品秘久久久久久| 国产精品成人午夜福利| 日韩色导航| 天堂久久久久| 日韩一级欧美一级| 在线观看三级网址| 亚洲无码视频在线免费观看| 最近中文字幕mv第三季歌词| 俺去操| 欧美久久性爱视频| 又黄又爽无遮挡| 黄色小电影在线观看| 未满十八18禁止免费无码网站| 国产精品久久久久久无码人妻| 91最新网址| 777欧美| 一插菊花综合| 欧美成人无码A片免费| 女同一区二区三区| 99久久夜色精品国产亚洲| 中文字幕亚洲日韩| 久热只有精品| 嫩BBB| 三级片在线观看视频| 国产又粗又猛又黄又爽无遮挡 | 日韩AV一区二区在线观看| 婷婷俺也去| 中文毛片| 久久久老熟女一区二区三区91 | 婷婷色婷婷| 国产一级A片视频| aaa片| 亚洲操逼网| 一区二区三区水蜜桃| 亚洲免费在线视频观看| 欧美色图狠狠操| AV香蕉| 足交在线观看| 天堂免费视频| 爽爽午国产浪潮AV性色www| 山西真实国产乱子伦| 伊人在线视频| aaa在线观看| 亚洲国产高清视频| 天堂视频在线观看亚洲美女| 色噜噜在线| 国产91综合一区在线观看| 自拍视频在线观看| 大香蕉综合网| 手机看片1024旧版| 青青草视频免费观看| 日韩视频一区二区| 91香蕉在线视频| 青青操逼| 亚洲网站免费| 久久99精品国产.久久久久 | 99精品国产热久久91色欲 | 日本成人三级片| 综合夜夜| 日韩操b| 操逼小电影| 日本一级婬片A片免费看| 日本色五月| 一本色道久久综合无码人妻四虎| 婷婷操逼网| 麻豆三级片在线观看| 国产成人三级片| 538在线视频| 日韩无码人妻久久一区二区三区 | 人人色在线观看| 人妻无码不卡| 操大爷影院| 97欧美精品人妻系列| 成人精品视频| 日韩AV一区二区在线观看| 夜夜爽夜夜| 亚洲成人性爱视频| 久久久噜噜噜| jiujiuav| 欧美日日| 成人精品永久免费视频99久久精品| 久久毛片基地| 久久精品秘一区二区三免费| 国产中文在线观看| 免费看无码一级A片在线播放| 五月丁香六月| 777欧美| av東熱激情东京热| 黄色片视频免费| 午夜久久| 日韩无码久久久| 亚洲91黄色片| 2021国产精品视频| 91蜜桃传媒在线观看| 四lll少妇BBBB槡BBBB| 国产精品扒开腿做爽爽爽A片唱戏| 国产精品视频| 中文字幕69| 荫蒂添到高潮免费视频| 最新无码在线| 97超碰人人操| 久久久久久久人妻丝袜| 不卡精品| 国产三级精品三级在线观看| 欧美国产三级| 欧美精品在线视频| 亚洲无码视频在线| 翔田千里53歳在线播放| 日本暖暖视频| 国产精品国产精品| 91视频一区二区三区| 米奇7777狠狠狠狠| 国产永久在线| 神马午夜福利影院| 成人黄片视频| 9I看片成人免费视频| 成人一区二区电影| 操操操无码| 成人a视频| 大香伊人| 777欧美| 国产视频成人| 在线无码一区二区三区| 国产精品一区二区在线| 成人免费毛片片v| 狠狠干2022| 少妇高潮喷水视频| h片免费在线观看| 色999网址| 亚洲AV无码成人精品区www| 日韩一级片免费看| 成人视频一区二区三区| 亚洲一区二区三区在线++中国| 亚洲黄色视频在线免费观看| 不卡a12| 97成人人妻一区二区三区| 亚洲成人在线播放| 伊人99在线| 国产在线观看91| 色色a| 天堂在线最新资源| 国产精品国产三级国产AⅤ| 久久这里精品| 五月丁香综合激情| 中文字幕免费看高清| 男女福利视频| 三级免费| 在线无码高清| 在线91网站| 一级a看片在线观看| 91啪啪视频| 国产精品天天AVJ精麻传媒| 老女人AV| 亚洲黄色免费电影| 日韩视频一区二区| 日韩电影免费在线观看| 99热热| 北条麻妃无码| 国产欧美精品成人在线观看| 俺来也俺去www色情网| 中文字幕高清无码视频| 激情在线视频| 日本欧美一级片| 久久久精品欧美| 淫香淫色综合网| AV狠狠干| 综合精品7799| 中文字幕黄色电影| 三级片AAA成人免费| 久久久久99精品成人片直播| 99xav| 欧美精品久久久久久久多人混战| 人妻懂色av粉嫩av浪潮av| av一级| 国产乱伦网| 久久午夜福利视频| 竹菊传媒一区二区三区| 国产黄色在线免费观看| 亚洲天堂一级片| 中文字幕+乱码+中文乱码视频在线观看| 国产棈品久久久久久久久久九秃 | 国产一级a毛一级a做免费图片| 视频一区在线观看| 欧美日韩视频一区二区| 欧美一级黄色大片| 婷婷久久久| 蜜乳av红桃嫩久久| 亚洲www在线观看| 色接久久| 思思热在线视频精品| 国产作爱| 操老女人逼| 欧美性受XXXX黑人XYX性爽一 | 免费一级A| 毛片毛片毛片毛片毛片| 日韩精品三区| 九九热99视频| 污视频在线看| 杨晨晨不雅视频| 97人人爽人人爽人人爽人人爽| 日韩AV免费在线| 亚洲天堂天天| 国产做爰XXXⅩ久久久骚妇| 人人妻人人爽人人澡人人精品| 色av影音先锋无吗一区| 欧美三级理论片| 在线观看免费无码视频| 91精品国产乱码久久久| 欧美人人| 91人妻人人澡人人精品| 天堂网中文字幕| 一本色道久久综合亚洲精品小说 | av天堂资源| 国产一级a毛一级a做免费图片| 国产香蕉视屏| 日韩黄色小电影| 国产免费麻豆| 91麻豆天美传媒在线| 亚洲色,天堂网| 高清一区二区三区| www日韩欧美| 亚洲国产婷婷香蕉A片| 国产A片录制现场妹子都很多 | 伊人成人视频在线观看| 影音先锋在线视频观看| 欧美日在线| 国产熟妇搡BBBB搡BBBB搡| 日一日干一干| 日韩人妻无码专区一区二区| 天堂在线8| 伊人操| 色五月婷婷小说|