ASP.NET學(xué)習(xí)CORE中使用Cookie身份認(rèn)證方法
大家在使用ASP.NET的時候一定都用過FormsAuthentication做登錄用戶的身份認(rèn)證,F(xiàn)ormsAuthentication的核心就是Cookie,ASP.NET會將用戶名存儲在Cookie中。
現(xiàn)在到了ASP.NET CORE的時代,但是ASP.NET CORE中沒有FormsAuthentication這個東西,那么怎么做身份認(rèn)證呢?答案是ASP.NET CORE已經(jīng)為我們內(nèi)置了Cookie身份認(rèn)證的功能,而且使用起來非常方便,注意本文是基于ASP.NET CORE 2.0版本來闡述Cookie認(rèn)證方式的。
1.從ASP.NET CORE OWIN框架中啟用Cookie身份認(rèn)證功能
要在ASP.NET CORE中使用Cookie身份認(rèn)證,第一步就是在項目中的OWIN框架文件Startup.cs中啟用Cookie身份認(rèn)證中間件。
首先我們在Startup中的ConfigureServices方法中使用services.AddAuthentication注冊Cookie認(rèn)證服務(wù),如下代碼所示:
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); //注冊Cookie認(rèn)證服務(wù) services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(); }
然后在Startup中的Configure方法中使用app.UseAuthentication啟用Cookie認(rèn)證中間件(注意其中app.UseAuthentication和app.UseMvc的調(diào)用順序不能反),如下代碼所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); //注意app.UseAuthentication方法一定要放在下面的app.UseMvc方法前面,否者后面就算調(diào)用HttpContext.SignInAsync進(jìn)行用戶登錄后,使用 //HttpContext.User還是會顯示用戶沒有登錄,并且HttpContext.User.Claims讀取不到登錄用戶的任何信息。 //這說明Asp.Net OWIN框架中MiddleWare的調(diào)用順序會對系統(tǒng)功能產(chǎn)生很大的影響,各個MiddleWare的調(diào)用順序一定不能反 app.UseAuthentication(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
2.登錄用戶
在ASP.NET CORE中使用Cookie認(rèn)證登錄用戶的方法和傳統(tǒng)的FormsAuthentication不太一樣,大致步驟如下:
創(chuàng)建Claim類型的數(shù)組,將登錄用戶的所有信息(比如用戶名)存儲在Claim類型的字符串鍵值對中
將上面創(chuàng)建的Claim類型的數(shù)組傳入ClaimsIdentity中,用來構(gòu)造一個ClaimsIdentity對象
將上面創(chuàng)建的ClaimsIdentity對象傳入ClaimsPrincipal中,用來構(gòu)造一個ClaimsPrincipal對象
調(diào)用HttpContext.SignInAsync方法,傳入上面創(chuàng)建的ClaimsPrincipal對象,完成用戶登錄
所以我們可以看到整個ASP.NET CORE的Cookie認(rèn)證登錄流程比以前ASP.NET的FormsAuthentication還是要復(fù)雜許多,畢竟以前一個FormsAuthentication.SetAuthCookie方法就搞定了。
在本文的例子中我們在項目中默認(rèn)的HomeController中創(chuàng)建了一個Acion方法Login,來實現(xiàn)用戶登錄的代碼。當(dāng)然這里我們實現(xiàn)的是最簡的Cookie登錄,下面代碼中實際上還可以設(shè)置Cookie是否持久化、Cookie多久過期、存儲登錄用戶信息的Cookie的名字是什么等,我們就不做過多介紹了,大家可以閱讀本文最后推薦的兩份官方文檔了解更多。
Login方法的代碼如下:
/// <summary> /// 該Action登錄用戶Wangdacui到Asp.Net Core /// </summary> public IActionResult Login() { //下面的變量claims是Claim類型的數(shù)組,Claim是string類型的鍵值對,所以claims數(shù)組中可以存儲任意個和用戶有關(guān)的信息, //不過要注意這些信息都是加密后存儲在客戶端瀏覽器cookie中的,所以最好不要存儲太多特別敏感的信息,這里我們只存儲了用戶名到claims數(shù)組, //表示當(dāng)前登錄的用戶是誰 var claims = new[] { new Claim("UserName", "Wangdacui") }; var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); ClaimsPrincipal user = new ClaimsPrincipal(claimsIdentity); //登錄用戶,相當(dāng)于ASP.NET中的FormsAuthentication.SetAuthCookie HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user).Wait(); //可以使用HttpContext.SignInAsync方法的重載來定義持久化cookie存儲用戶認(rèn)證信息,例如下面的代碼就定義了用戶登錄后60分鐘內(nèi)cookie都會保留在客戶端計算機(jī)硬盤上, //即便用戶關(guān)閉了瀏覽器,60分鐘內(nèi)再次訪問站點仍然是處于登錄狀態(tài),除非調(diào)用Logout方法注銷登錄。 /* HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, user, new AuthenticationProperties() { IsPersistent = true, ExpiresUtc = DateTimeOffset.Now.AddMinutes(60) }).Wait(); */ return View(); }
3.讀取登錄用戶信息
那么用戶登錄后怎么將登錄用戶的信息(比如用戶名)讀取出來呢?我們在HomeController的Index方法中演示了如何判斷當(dāng)前用戶是否已經(jīng)登錄,并且讀出登錄用戶的用戶名,Index方法的代碼如下所示:
/// <summary> /// 該Action判斷用戶是否已經(jīng)登錄,如果已經(jīng)登錄,那么讀取登錄用戶的用戶名 /// </summary> public IActionResult Index() { //如果HttpContext.User.Identity.IsAuthenticated為true, //或者HttpContext.User.Claims.Count()大于0表示用戶已經(jīng)登錄 if (HttpContext.User.Identity.IsAuthenticated) { //這里通過 HttpContext.User.Claims 可以將我們在Login這個Action中存儲到cookie中的所有 //claims鍵值對都讀出來,比如我們剛才定義的UserName的值Wangdacui就在這里讀取出來了 var userName = HttpContext.User.Claims.First().Value; } return View(); }
4.注銷用戶
那么登錄用戶后怎么注銷登錄呢?我們在HomeController的Logout方法中演示了如何注銷登錄的用戶,代碼如下所示:
/// <summary> /// 該Action從Asp.Net Core中注銷登錄的用戶 /// </summary> public IActionResult Logout() { //注銷登錄的用戶,相當(dāng)于ASP.NET中的FormsAuthentication.SignOut HttpContext.SignOutAsync().Wait(); return View(); }
前面說了實際上在ASP.NET CORE的Cookie認(rèn)證中還可以設(shè)置Cookie的名字、是否持久化存儲等。
以上就是本次小編整理的全部內(nèi)容,感謝你對腳本之家的支持。
- ASP.NET?Core中Cookie驗證身份用法詳解
- asp.core?同時兼容JWT身份驗證和Cookies?身份驗證兩種模式(示例詳解)
- .NET?Core支持Cookie和JWT混合認(rèn)證、授權(quán)的方法
- asp.net core3.1cookie和jwt混合認(rèn)證授權(quán)實現(xiàn)多種身份驗證方案
- ASP.NET Core 使用Cookie驗證身份的示例代碼
- asp.net core中如何使用cookie身份驗證
- 3分鐘快速學(xué)會在ASP.NET Core MVC中如何使用Cookie
- 詳解在ASP.NET Core 中使用Cookie中間件
- 詳解ASP.NET與ASP.NET Core用戶驗證Cookie并存解決方案
- ASP.NET?Core在WebApi項目中使用Cookie
相關(guān)文章
防止在服務(wù)器處理完成之前用戶多次點擊提交按鈕處理代碼
在提交表單時,如果網(wǎng)頁速度過慢或者其他原因,用戶多次提交能導(dǎo)致數(shù)據(jù)的修改,怎么解決這個問題呢,接下來將為您解決這個問題,需要的朋友可以了解下2012-12-12Web系統(tǒng)通過EXE文件實現(xiàn)讀取客戶電腦MAC等硬件信息且兼容非IE瀏覽器
我們在實際Web應(yīng)用中,可能會遇到“需要限定特定的電腦或用戶才能使用系統(tǒng)”的問題。2014-08-08告別ADO.NET實現(xiàn)應(yīng)用系統(tǒng)無縫切換的煩惱(總結(jié)篇)
說起ADO.NET,就扯上了數(shù)據(jù)庫訪問類庫了,現(xiàn)在的每個項目的數(shù)據(jù)庫訪問類應(yīng)該說都很強(qiáng)的了,經(jīng)常就聽到說我的我們的數(shù)據(jù)庫訪問類怎么怎么強(qiáng)大而且支持多數(shù)據(jù)庫,現(xiàn)在的大家做的項目里用的數(shù)據(jù)庫訪問類庫我想也都是支持多數(shù)據(jù)庫吧,支持到什么程度我就不知道了2009-11-11Asp.net實現(xiàn)MVC處理文件的上傳下載功能實例教程
這篇文章主要介紹了Asp.net實現(xiàn)MVC處理文件的上傳下載功能,比較全面而系統(tǒng)的對Asp.net MVC的文件上傳下載功能進(jìn)行了深入分析,有很好的借鑒價值,需要的朋友可以參考下2014-08-08asp.net 請求輸入到輸出的全過程及httpHandler和httpModuler詳細(xì)介紹
看了幾篇講述httpHandler和HttpModuler的文章,雖然說沒有完全了解底層操作,但是我也算明白了一個請求從進(jìn)入IIS到最后輸出都經(jīng)歷了哪些過程,感興趣的朋友可以了解下2013-01-01巧妙使用JQuery Clone 添加多行數(shù)據(jù),并更新到數(shù)據(jù)庫的實現(xiàn)代碼
巧妙使用JQuery Clone 添加多行數(shù)據(jù),并更新到數(shù)據(jù)庫的實現(xiàn)代碼,需要的朋友可以參考下。2011-12-12asp.net 1.1/ 2.0 中快速實現(xiàn)單點登陸
asp.net 1.1/ 2.0 中快速實現(xiàn)單點登陸...2007-04-04.NET使用.NET Core CLI開發(fā)應(yīng)用程序
這篇文章主要為大家詳細(xì)介紹了.NET使用.NET Core CLI開發(fā)應(yīng)用程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08