3分鐘快速學(xué)會(huì)在ASP.NET Core MVC中如何使用Cookie
一.Cookie是什么?
我的朋友問(wèn)我cookie是什么,用來(lái)干什么的,可是我居然無(wú)法清楚明白簡(jiǎn)短地向其闡述cookie,這不禁讓我陷入了沉思:為什么我無(wú)法解釋清楚,我對(duì)學(xué)習(xí)的方法產(chǎn)生了懷疑!所以我們?cè)趯W(xué)習(xí)一個(gè)東西的時(shí)候,一定要做到知其然知其所以然。
HTTP協(xié)議本身是無(wú)狀態(tài)的。什么是無(wú)狀態(tài)呢,即服務(wù)器無(wú)法判斷用戶身份。Cookie實(shí)際上是一小段的文本信息)??蛻舳讼蚍?wù)器發(fā)起請(qǐng)求,如果服務(wù)器需要記錄該用戶狀態(tài),就使用response向客戶端瀏覽器頒發(fā)一個(gè)Cookie??蛻舳藶g覽器會(huì)把Cookie保存起來(lái)。當(dāng)瀏覽器再請(qǐng)求該網(wǎng)站時(shí),瀏覽器把請(qǐng)求的網(wǎng)址連同該Cookie一同提交給服務(wù)器。服務(wù)器檢查該Cookie,以此來(lái)辨認(rèn)用戶狀態(tài)。
打個(gè)比方,這就猶如你辦理了銀行卡,下次你去銀行辦業(yè)務(wù),直接拿銀行卡就行,不需要身份證。
二.在.NET Core中嘗試
廢話不多說(shuō),干就完了,現(xiàn)在我們創(chuàng)建ASP.NET Core MVC項(xiàng)目,撰寫(xiě)該文章時(shí)使用的.NET Core SDK 3.0 構(gòu)建的項(xiàng)目,創(chuàng)建完畢之后我們無(wú)需安裝任何包,
但是我們需要在Startup中添加一些配置,用于Cookie相關(guān)的。
//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>(); }
在其中我們配置登錄頁(yè)面,其中 AddAuthentication 中是我們的方案名稱,這個(gè)是做什么的呢?很多小伙伴都懵懵懂懂表示很懵逼啊,我看很多人也是都寫(xiě)得默認(rèn),那它到底有啥用,經(jīng)過(guò)我看AspNetCore源碼發(fā)現(xiàn)它這個(gè)是可以做一些配置的??聪旅娴拇a:
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 的變量就可以替換某些配置,在配置中一共有這幾項(xiàng),這無(wú)疑是幫助我們快速使用Cookie的好幫手~點(diǎn)個(gè)贊。
在源碼中可以看到Cookie默認(rèn)保存的時(shí)間是14天,這個(gè)時(shí)間我們可以去選擇,支持TimeSpan的那些類型。
public CookieAuthenticationOptions() { ExpireTimeSpan = TimeSpan.FromDays(14); ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter; SlidingExpiration = true; Events = new CookieAuthenticationEvents(); }
接下來(lái)LoginOrOut Controller,我們模擬了登錄和退出,通過(guò) 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 () => { //注銷(xiāo)登錄的用戶,相當(dāng)于ASP.NET中的FormsAuthentication.SignOut await HttpContext.SignOutAsync(); }).Wait(); return View(); }
就拿出推出的源碼來(lái)看,其中獲取了Handler的某些信息,隨后將它轉(zhuǎn)換為 IAuthenticationSignOutHandler 接口類型,這個(gè)接口 as 接口,像是在地方實(shí)現(xiàn)了這個(gè)接口,然后將某些運(yùn)行時(shí)的值引用傳遞到該接口上。
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 中根據(jù)認(rèn)證策略創(chuàng)建了某些實(shí)例,這里不再多說(shuō),因?yàn)樵创a深不見(jiàn)底,我也說(shuō)不太清楚...只是想表達(dá)一下看源碼的好處和壞處....
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; }
最后我們?cè)陧?yè)面上想要獲取登錄的信息,可以通過(guò) 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
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- ASP.NET?Core中Cookie驗(yàn)證身份用法詳解
- asp.core?同時(shí)兼容JWT身份驗(yàn)證和Cookies?身份驗(yàn)證兩種模式(示例詳解)
- .NET?Core支持Cookie和JWT混合認(rèn)證、授權(quán)的方法
- asp.net core3.1cookie和jwt混合認(rèn)證授權(quán)實(shí)現(xiàn)多種身份驗(yàn)證方案
- ASP.NET Core 使用Cookie驗(yàn)證身份的示例代碼
- asp.net core中如何使用cookie身份驗(yàn)證
- ASP.NET學(xué)習(xí)CORE中使用Cookie身份認(rèn)證方法
- 詳解在ASP.NET Core 中使用Cookie中間件
- 詳解ASP.NET與ASP.NET Core用戶驗(yàn)證Cookie并存解決方案
- ASP.NET?Core在WebApi項(xiàng)目中使用Cookie
相關(guān)文章
ASP.NET 控件開(kāi)發(fā)系列之圖片切換web控件
剛開(kāi)始學(xué)習(xí)控件開(kāi)發(fā),寫(xiě)了一個(gè)web圖片切換控件,歡迎大家拍磚.2010-04-04ASP.NET MVC 4使用PagedList.Mvc分頁(yè)的實(shí)現(xiàn)代碼
本篇文章主要介紹了ASP.NET MVC 4使用PagedList.Mvc分頁(yè)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07ASP.NET Core Middleware的實(shí)現(xiàn)方法詳解
中間件是組裝到應(yīng)用程序管道中以處理請(qǐng)求和響應(yīng)的軟件。下面這篇文章主要給大家介紹了關(guān)于ASP.NET Core Middleware實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2019-01-01ASP.net?Core微信平臺(tái)開(kāi)發(fā)配置Token
這篇文章主要為大家介紹了ASP.net?Core微信平臺(tái)開(kāi)發(fā)配置Token有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04ASP.NET?MVC實(shí)現(xiàn)單個(gè)圖片上傳、限制圖片格式與大小并在服務(wù)端裁剪圖片
這篇文章介紹了ASP.NET?MVC實(shí)現(xiàn)單個(gè)圖片上傳、限制圖片格式與大小并在服務(wù)端裁剪圖片的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09Visual Studio 2017無(wú)法加載Visual Studio 2015創(chuàng)建的SharePoint解決方法
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2017無(wú)法加載Visual Studio 2015創(chuàng)建的SharePoint的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03asp.net(c#)ref,out ,params的區(qū)別
C#中有三個(gè)關(guān)鍵字-ref,out ,params,雖然本人不喜歡這三個(gè)關(guān)鍵字,因?yàn)樗鼈円伤破茐拿嫦驅(qū)ο筇匦?。但是既然m$把融入在c#體系中,那么我們就來(lái)認(rèn)識(shí)一下參數(shù)修飾符ref,out ,params吧,還有它們的區(qū)別。2009-12-12