国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > 幫助中心 > 正文

ASP.NET Cookie是怎么生成的(推薦)

2024-07-09 22:43:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

可能有人知道Cookie的生成由machineKey有關(guān),machineKey用于決定Cookie生成的算法和密鑰,并如果使用多臺(tái)服務(wù)器做負(fù)載均衡時(shí),必須指定一致的machineKey用于解密,那么這個(gè)過(guò)程到底是怎樣的呢?

如果需要在.NET Core中使用ASP.NET Cookie,本文將提到的內(nèi)容也將是一些必經(jīng)之路。

抽絲剝繭,一步一步分析
首先用戶(hù)通過(guò)AccountController->Login進(jìn)行登錄:

//// POST: /Account/Loginpublic async Task<ActionResult> Login(LoginViewModel model, string returnUrl){ if (!ModelState.IsValid) { return View(model); } var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); switch (result) { case SignInStatus.Success:  return RedirectToLocal(returnUrl); // ......省略其它代碼 }}

它調(diào)用了SignInManager的PasswordSignInAsync方法,該方法代碼如下(有刪減):

public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout){ // ...省略其它代碼 if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture()) { if (!await IsTwoFactorEnabled(user)) {  await UserManager.ResetAccessFailedCountAsync(user.Id).WithCurrentCulture(); } return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture(); } // ...省略其它代碼 return SignInStatus.Failure;}

想瀏覽原始代碼,可參見(jiàn)官方的Github鏈接:

https://github.com/aspnet/AspNetIdentity/blob/master/src/Microsoft.AspNet.Identity.Owin/SignInManager.cs#L235-L276

可見(jiàn)它先需要驗(yàn)證密碼,密碼驗(yàn)證正確后,它調(diào)用了SignInOrTwoFactor方法,該方法代碼如下:

private async Task<SignInStatus> SignInOrTwoFactor(TUser user, bool isPersistent){ var id = Convert.ToString(user.Id); if (await IsTwoFactorEnabled(user) && !await AuthenticationManager.TwoFactorBrowserRememberedAsync(id).WithCurrentCulture()) { var identity = new ClaimsIdentity(DefaultAuthenticationTypes.TwoFactorCookie); identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, id)); AuthenticationManager.SignIn(identity); return SignInStatus.RequiresVerification; } await SignInAsync(user, isPersistent, false).WithCurrentCulture(); return SignInStatus.Success;}

該代碼只是判斷了是否需要做雙重驗(yàn)證,在需要雙重驗(yàn)證的情況下,它調(diào)用了AuthenticationManager的SignIn方法;否則調(diào)用SignInAsync方法。SignInAsync的源代碼如下:

public virtual async Task SignInAsync(TUser user, bool isPersistent, bool rememberBrowser){ var userIdentity = await CreateUserIdentityAsync(user).WithCurrentCulture(); // Clear any partial cookies from external or two factor partial sign ins AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.TwoFactorCookie); if (rememberBrowser) { var rememberBrowserIdentity = AuthenticationManager.CreateTwoFactorRememberBrowserIdentity(ConvertIdToString(user.Id)); AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, userIdentity, rememberBrowserIdentity); } else { AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, userIdentity); }}
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 姚安县| 阿拉尔市| 无极县| 红原县| 紫云| 横山县| 东乌| 株洲县| 德安县| 团风县| 普兰县| 遂川县| 屯昌县| 洛南县| 东兴市| 萨迦县| 南涧| 旬阳县| 来安县| 兴隆县| 甘洛县| 宜都市| 桂平市| 姚安县| 神农架林区| 杭锦后旗| 聂拉木县| 随州市| 隆回县| 武冈市| 乌兰浩特市| 辛集市| 泌阳县| 宝应县| 惠州市| 舟曲县| 栾川县| 集安市| 余干县| 盐津县| 哈密市|