3分鐘快速學會在ASP.NET Core MVC中如何使用Cookie

 更新時間:2020-01-25 00:02:18   作者:佚名   我要評論(0)

一.Cookie是什么?


我的朋友問我cookie是什么,用來干什么的,可是我居然無法清楚明白簡短地向其闡述cookie,這不禁讓我陷入了沉思:為什么我無法解釋清楚,我對

一.Cookie是什么?

我的朋友問我cookie是什么,用來干什么的,可是我居然無法清楚明白簡短地向其闡述cookie,這不禁讓我陷入了沉思:為什么我無法解釋清楚,我對學習的方法產生了懷疑!所以我們在學習一個東西的時候,一定要做到知其然知其所以然。

HTTP協議本身是無狀態的。什么是無狀態呢,即服務器無法判斷用戶身份。Cookie實際上是一小段的文本信息)。客戶端向服務器發起請求,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。

打個比方,這就猶如你辦理了銀行卡,下次你去銀行辦業務,直接拿銀行卡就行,不需要身份證。

二.在.NET Core中嘗試

廢話不多說,干就完了,現在我們創建ASP.NET Core MVC項目,撰寫該文章時使用的.NET Core SDK 3.0 構建的項目,創建完畢之后我們無需安裝任何包,

但是我們需要在Startup中添加一些配置,用于Cookie相關的。

//public const string CookieScheme = "YourSchemeName";
  public Startup(IConfiguration configuration)
  {
   Configuration = configuration;
  }
  public IConfiguration Configuration { get; }
  // This method gets called by the runtime. Use this method to add services to the container.
  public void ConfigureServices(IServiceCollection services)
  {
   //CookieAuthenticationDefaults.AuthenticationScheme Cookies Default Value
   //you can change scheme
   services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options => {
     options.LoginPath = "/LoginOrSignOut/Index/";
    });
   services.AddControllersWithViews();
   // is able to also use other services.
   //services.AddSingleton<IConfigureOptions<CookieAuthenticationOptions>, ConfigureMyCookie>();
  }

在其中我們配置登錄頁面,其中 AddAuthentication 中是我們的方案名稱,這個是做什么的呢?很多小伙伴都懵懵懂懂表示很懵逼啊,我看很多人也是都寫得默認,那它到底有啥用,經過我看AspNetCore源碼發現它這個是可以做一些配置的。看下面的代碼:

internal class ConfigureMyCookie : IConfigureNamedOptions<CookieAuthenticationOptions>
 {
  // You can inject services here
  public ConfigureMyCookie()
  {}
  public void Configure(string name, CookieAuthenticationOptions options)
  {
   // Only configure the schemes you want
   //if (name == Startup.CookieScheme)
   //{
    // options.LoginPath = "/someotherpath";
   //}
  }
  public void Configure(CookieAuthenticationOptions options)
   => Configure(Options.DefaultName, options);
 }

在其中你可以定義某些策略,隨后你直接改變 CookieScheme 的變量就可以替換某些配置,在配置中一共有這幾項,這無疑是幫助我們快速使用Cookie的好幫手~點個贊。


在源碼中可以看到Cookie默認保存的時間是14天,這個時間我們可以去選擇,支持TimeSpan的那些類型。

public CookieAuthenticationOptions()
  {
   ExpireTimeSpan = TimeSpan.FromDays(14);
   ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
   SlidingExpiration = true;
   Events = new CookieAuthenticationEvents();
  }

接下來LoginOrOut Controller,我們模擬了登錄和退出,通過 SignInAsync 和 SignOutAsync 方法。

[HttpPost]
  public async Task<IActionResult> Login(LoginModel loginModel)
  {
   if (loginModel.Username == "haozi zhang" &&
    loginModel.Password == "123456")
   {
    var claims = new List<Claim>
     {
     new Claim(ClaimTypes.Name, loginModel.Username)
     };
    ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(claims, "login"));
    await HttpContext.SignInAsync(principal);
    //Just redirect to our index after logging in. 
    return Redirect("/Home/Index");
   }
   return View("Index");
  }
  /// <summary>
  /// this action for web lagout 
  /// </summary>
  [HttpGet]
  public IActionResult Logout()
  {
   Task.Run(async () =>
   {
    //注銷登錄的用戶,相當于ASP.NET中的FormsAuthentication.SignOut 
    await HttpContext.SignOutAsync();
   }).Wait();
   return View();
  }

就拿出推出的源碼來看,其中獲取了Handler的某些信息,隨后將它轉換為 IAuthenticationSignOutHandler 接口類型,這個接口 as 接口,像是在地方實現了這個接口,然后將某些運行時的值引用傳遞到該接口上。

public virtual async Task SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties)
  {
   if (scheme == null)
   {
    var defaultScheme = await Schemes.GetDefaultSignOutSchemeAsync();
    scheme = defaultScheme?.Name;
    if (scheme == null)
    {
     throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultSignOutScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action<AuthenticationOptions> configureOptions).");
    }
   }
   var handler = await Handlers.GetHandlerAsync(context, scheme);
   if (handler == null)
   {
    throw await CreateMissingSignOutHandlerException(scheme);
   }
   var signOutHandler = handler as IAuthenticationSignOutHandler;
   if (signOutHandler == null)
   {
    throw await CreateMismatchedSignOutHandlerException(scheme, handler);
   }
   await signOutHandler.SignOutAsync(properties);
  }

其中 GetHandlerAsync 中根據認證策略創建了某些實例,這里不再多說,因為源碼深不見底,我也說不太清楚...只是想表達一下看源碼的好處和壞處....

public async Task<IAuthenticationHandler> GetHandlerAsync(HttpContext context, string authenticationScheme)
  {
   if (_handlerMap.ContainsKey(authenticationScheme))
   {
    return _handlerMap[authenticationScheme];
   }

   var scheme = await Schemes.GetSchemeAsync(authenticationScheme);
   if (scheme == null)
   {
    return null;
   }
   var handler = (context.RequestServices.GetService(scheme.HandlerType) ??
    ActivatorUtilities.CreateInstance(context.RequestServices, scheme.HandlerType))
    as IAuthenticationHandler;
   if (handler != null)
   {
    await handler.InitializeAsync(scheme, context);
    _handlerMap[authenticationScheme] = handler;
   }
   return handler;
  }

最后我們在頁面上想要獲取登錄的信息,可以通過 HttpContext.User.Claims 中的簽名信息獲取。

@using Microsoft.AspNetCore.Authentication
<h2>HttpContext.User.Claims</h2>
<dl>
 @foreach (var claim in User.Claims)
 {
  <dt>@claim.Type</dt>
  <dd>@claim.Value</dd>
 }
</dl>
<h2>AuthenticationProperties</h2>
<dl>
 @foreach (var prop in (await Context.AuthenticateAsync()).Properties.Items)
 {
  <dt>@prop.Key</dt>
  <dd>@prop.Value</dd>
 }
</dl>

三.最后效果以及源碼地址#


GitHub地址:https://github.com/zaranetCore/aspNetCore_JsonwebToken/tree/master/src/Identity.Cookie/DotNetCore_Cookie_Sample

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:

  • asp.net cookie的操作,寫入、讀取與操作
  • ASP.NET之Response.Cookies.Remove 無法刪除COOKIE的原因
  • asp.net清空Cookie的兩種方法
  • asp.net Cookie跨域、虛擬目錄等設置方法
  • asp.net(C#)跨域及跨域寫Cookie問題
  • asp.net Cookie值中文亂碼問題解決方法
  • asp.net利用cookie保存用戶密碼實現自動登錄的方法
  • asp.net關于Cookie跨域(域名)的問題
  • asp.net中的cookie使用介紹
  • asp.net cookie清除的代碼

相關文章

  • 3分鐘快速學會在ASP.NET Core MVC中如何使用Cookie

    3分鐘快速學會在ASP.NET Core MVC中如何使用Cookie

    一.Cookie是什么? 我的朋友問我cookie是什么,用來干什么的,可是我居然無法清楚明白簡短地向其闡述cookie,這不禁讓我陷入了沉思:為什么我無法解釋清楚,我對
    2020-01-25
  • ASP.Net Core3.0中使用JWT認證的實現

    ASP.Net Core3.0中使用JWT認證的實現

    JWT認證簡單介紹 關于Jwt的介紹網上很多,此處不在贅述,我們主要看看jwt的結構。 JWT主要由三部分組成,如下: HEADER.PAYLOAD.SIGNATURE HEADER 包含token的元
    2020-01-25
  • DataReader不能使用using的詳細示例

    DataReader不能使用using的詳細示例

    本文介紹了DataReader不能使用using的詳細示例,分享給大家,具有如下: public static MySqlDataReader ExecuteMySqlReader(string sqlStr) { MySqlConnection c
    2020-01-25
  • asp.net MVC 在Controller控制器中實現驗證碼輸出功能

    asp.net MVC 在Controller控制器中實現驗證碼輸出功能

    asp.net mvc項目使用到驗證碼,為了讓以前的WebForm代碼能利用上代碼經過稍微的改動即可使用代碼如下: using System; using System.Collections.Generic; usin
    2020-01-25
  • 淺談.Net Core 認證系統源碼解析

    淺談.Net Core 認證系統源碼解析

    不知不覺.Net Core已經推出到3.1了,大多數以.Net為技術棧的公司也開始逐步的切換到了Core,從業也快3年多了,一直堅持著.不管環境怎么變,堅持自己的當初的選擇,堅持信
    2020-01-25
  • .NET連接池的問題詳解

    .NET連接池的問題詳解

    NET 連接池救生員 防止可淹沒應用程序的池溢出 William Vaughn 大多數 ADO.NET 數據提供程序使用連接池,以提高圍繞 Microsoft 斷開連接的 .NET 結構構建的應用程序
    2020-01-25
  • .Net獲取IP地址的方法

    .Net獲取IP地址的方法

    獲取本機IP 2.獲取網頁客戶端IP /// <summary> /// 獲取IPv4地址 /// </summary> /// <returns> </returns> public static string G
    2020-01-25
  • ASP.NET Core 3框架揭秘之 異步線程無法使用IServiceProvider問題

    ASP.NET Core 3框架揭秘之 異步線程無法使用IServiceProvider問題

    標題反映的是上周五一個同事咨詢我的問題,我覺得這是一個很好的問題。這個問題有助于我們深入理解依賴注入框架在ASP.NET Core中的應用,以及服務實例的生命周期。
    2020-01-25
  • .net Core 使用IHttpClientFactory請求實現

    .net Core 使用IHttpClientFactory請求實現

    導讀:本文已添加在 晨曦微服務之旅 ,現在自己在嘗試微服務架構,一邊學邊做項目快速的進入狀態。當然在學習的過程中會將自己學到的知識進行分享。 一、為什么
    2020-01-25
  • .Net Core3.0 WEB API中使用FluentValidation驗證(批量注入)

    .Net Core3.0 WEB API中使用FluentValidation驗證(批量注入)

    為什么要使用FluentValidation 1.在日常的開發中,需要驗證參數的合理性,不緊前端需要驗證傳毒的參數,后端也需要驗證參數 2.在領域模型中也應該驗證,做好防御
    2020-01-25

最新評論

老快3投注技巧 股票涨跌是什么意思 理财平台哪个安全可靠 江西快三综合走势图 新疆体彩十一选五 浙江11选5开奖现场 股票指数有什么作用 百度网盘 山西快乐10分前三遗漏 飞鱼彩票基本走势图 青海11选5推荐号码 福彩3d彩吧论坛 东莞期货配资公司 赛车pk10高手交流群 快乐10分20选8技巧 澳洲幸运10在哪个网站可以玩 美国股票指数道琼斯走势 海南4+1彩票规则