ASP.NET學(xué)習(xí)CORE中使用Cookie身份認(rèn)證方法
大家在使用ASP.NET的時(shí)候一定都用過(guò)FormsAuthentication做登錄用戶(hù)的身份認(rèn)證,F(xiàn)ormsAuthentication的核心就是Cookie,ASP.NET會(huì)將用戶(hù)名存儲(chǔ)在Cookie中。
現(xiàn)在到了ASP.NET CORE的時(shí)代,但是ASP.NET CORE中沒(méi)有FormsAuthentication這個(gè)東西,那么怎么做身份認(rèn)證呢?答案是ASP.NET CORE已經(jīng)為我們內(nèi)置了Cookie身份認(rèn)證的功能,而且使用起來(lái)非常方便,注意本文是基于A(yíng)SP.NET CORE 2.0版本來(lái)闡述Cookie認(rèn)證方式的。
1.從ASP.NET CORE OWIN框架中啟用Cookie身份認(rèn)證功能
要在A(yíng)SP.NET CORE中使用Cookie身份認(rèn)證,第一步就是在項(xiàng)目中的OWIN框架文件Startup.cs中啟用Cookie身份認(rèn)證中間件。
首先我們?cè)赟tartup中的ConfigureServices方法中使用services.AddAuthentication注冊(cè)Cookie認(rèn)證服務(wù),如下代碼所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
//注冊(cè)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)行用戶(hù)登錄后,使用
//HttpContext.User還是會(huì)顯示用戶(hù)沒(méi)有登錄,并且HttpContext.User.Claims讀取不到登錄用戶(hù)的任何信息。
//這說(shuō)明Asp.Net OWIN框架中MiddleWare的調(diào)用順序會(huì)對(duì)系統(tǒng)功能產(chǎn)生很大的影響,各個(gè)MiddleWare的調(diào)用順序一定不能反
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
2.登錄用戶(hù)
在A(yíng)SP.NET CORE中使用Cookie認(rèn)證登錄用戶(hù)的方法和傳統(tǒng)的FormsAuthentication不太一樣,大致步驟如下:
創(chuàng)建Claim類(lèi)型的數(shù)組,將登錄用戶(hù)的所有信息(比如用戶(hù)名)存儲(chǔ)在Claim類(lèi)型的字符串鍵值對(duì)中
將上面創(chuàng)建的Claim類(lèi)型的數(shù)組傳入ClaimsIdentity中,用來(lái)構(gòu)造一個(gè)ClaimsIdentity對(duì)象
將上面創(chuàng)建的ClaimsIdentity對(duì)象傳入ClaimsPrincipal中,用來(lái)構(gòu)造一個(gè)ClaimsPrincipal對(duì)象
調(diào)用HttpContext.SignInAsync方法,傳入上面創(chuàng)建的ClaimsPrincipal對(duì)象,完成用戶(hù)登錄
所以我們可以看到整個(gè)ASP.NET CORE的Cookie認(rèn)證登錄流程比以前ASP.NET的FormsAuthentication還是要復(fù)雜許多,畢竟以前一個(gè)FormsAuthentication.SetAuthCookie方法就搞定了。
在本文的例子中我們?cè)陧?xiàng)目中默認(rèn)的HomeController中創(chuàng)建了一個(gè)Acion方法Login,來(lái)實(shí)現(xiàn)用戶(hù)登錄的代碼。當(dāng)然這里我們實(shí)現(xiàn)的是最簡(jiǎn)的Cookie登錄,下面代碼中實(shí)際上還可以設(shè)置Cookie是否持久化、Cookie多久過(guò)期、存儲(chǔ)登錄用戶(hù)信息的Cookie的名字是什么等,我們就不做過(guò)多介紹了,大家可以閱讀本文最后推薦的兩份官方文檔了解更多。
Login方法的代碼如下:
/// <summary>
/// 該Action登錄用戶(hù)Wangdacui到Asp.Net Core
/// </summary>
public IActionResult Login() {
//下面的變量claims是Claim類(lèi)型的數(shù)組,Claim是string類(lèi)型的鍵值對(duì),所以claims數(shù)組中可以存儲(chǔ)任意個(gè)和用戶(hù)有關(guān)的信息,
//不過(guò)要注意這些信息都是加密后存儲(chǔ)在客戶(hù)端瀏覽器cookie中的,所以最好不要存儲(chǔ)太多特別敏感的信息,這里我們只存儲(chǔ)了用戶(hù)名到claims數(shù)組,
//表示當(dāng)前登錄的用戶(hù)是誰(shuí)
var claims = new[] {
new Claim("UserName", "Wangdacui")
};
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
ClaimsPrincipal user = new ClaimsPrincipal(claimsIdentity);
//登錄用戶(hù),相當(dāng)于A(yíng)SP.NET中的FormsAuthentication.SetAuthCookie
HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user).Wait();
//可以使用HttpContext.SignInAsync方法的重載來(lái)定義持久化cookie存儲(chǔ)用戶(hù)認(rèn)證信息,例如下面的代碼就定義了用戶(hù)登錄后60分鐘內(nèi)cookie都會(huì)保留在客戶(hù)端計(jì)算機(jī)硬盤(pán)上,
//即便用戶(hù)關(guān)閉了瀏覽器,60分鐘內(nèi)再次訪(fǎng)問(wèn)站點(diǎn)仍然是處于登錄狀態(tài),除非調(diào)用Logout方法注銷(xiāo)登錄。
/*
HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
user, new AuthenticationProperties() { IsPersistent = true, ExpiresUtc = DateTimeOffset.Now.AddMinutes(60) }).Wait();
*/
return View();
}
3.讀取登錄用戶(hù)信息
那么用戶(hù)登錄后怎么將登錄用戶(hù)的信息(比如用戶(hù)名)讀取出來(lái)呢?我們?cè)贖omeController的Index方法中演示了如何判斷當(dāng)前用戶(hù)是否已經(jīng)登錄,并且讀出登錄用戶(hù)的用戶(hù)名,Index方法的代碼如下所示:
/// <summary>
/// 該Action判斷用戶(hù)是否已經(jīng)登錄,如果已經(jīng)登錄,那么讀取登錄用戶(hù)的用戶(hù)名
/// </summary>
public IActionResult Index()
{
//如果HttpContext.User.Identity.IsAuthenticated為true,
//或者HttpContext.User.Claims.Count()大于0表示用戶(hù)已經(jīng)登錄
if (HttpContext.User.Identity.IsAuthenticated)
{
//這里通過(guò) HttpContext.User.Claims 可以將我們?cè)贚ogin這個(gè)Action中存儲(chǔ)到cookie中的所有
//claims鍵值對(duì)都讀出來(lái),比如我們剛才定義的UserName的值Wangdacui就在這里讀取出來(lái)了
var userName = HttpContext.User.Claims.First().Value;
}
return View();
}
4.注銷(xiāo)用戶(hù)
那么登錄用戶(hù)后怎么注銷(xiāo)登錄呢?我們?cè)贖omeController的Logout方法中演示了如何注銷(xiāo)登錄的用戶(hù),代碼如下所示:
/// <summary>
/// 該Action從Asp.Net Core中注銷(xiāo)登錄的用戶(hù)
/// </summary>
public IActionResult Logout()
{
//注銷(xiāo)登錄的用戶(hù),相當(dāng)于A(yíng)SP.NET中的FormsAuthentication.SignOut
HttpContext.SignOutAsync().Wait();
return View();
}
前面說(shuō)了實(shí)際上在A(yíng)SP.NET CORE的Cookie認(rèn)證中還可以設(shè)置Cookie的名字、是否持久化存儲(chǔ)等。
以上就是本次小編整理的全部?jī)?nèi)容,感謝你對(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)證
- 3分鐘快速學(xué)會(huì)在A(yíng)SP.NET Core MVC中如何使用Cookie
- 詳解在A(yíng)SP.NET Core 中使用Cookie中間件
- 詳解ASP.NET與ASP.NET Core用戶(hù)驗(yàn)證Cookie并存解決方案
- ASP.NET?Core在WebApi項(xiàng)目中使用Cookie
相關(guān)文章
解析如何利用一個(gè)ASP.NET Core應(yīng)用來(lái)發(fā)布靜態(tài)文件
本文主要通過(guò)一些簡(jiǎn)單的實(shí)例來(lái)體驗(yàn)一下如何在一個(gè)ASP.NET Core應(yīng)用中發(fā)布靜態(tài)文件。針對(duì)不同格式的靜態(tài)文件請(qǐng)求的處理,ASP.NET Core為我們提供了三個(gè)中間件,它們將是本系列文章論述的重點(diǎn)。有需要的朋友可以看下2016-12-12
Asp.net移除Server,X-Powered-By和X-AspNet-Version頭
這篇文章主要介紹了Asp.net移除Server,?X-Powered-By,?和X-AspNet-Version頭,移除X-AspNet-Version很簡(jiǎn)單,只需要在Web.config中增加相應(yīng)配置節(jié),感興趣的朋友一起看看吧2024-02-02
詳解ASP.NET Core MVC 源碼學(xué)習(xí):Routing 路由
本篇文章主要介紹了詳解ASP.NET Core MVC 源碼學(xué)習(xí):Routing 路由 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
詳解ASP.NET MVC下的異步Action的定義和執(zhí)行原理
這篇文章主要介紹了詳解ASP.NET MVC下的異步Action的定義和執(zhí)行原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
Asp.net MVC 對(duì)所有用戶(hù)輸入的字符串字段做Trim處理的方法
這篇文章主要介紹了Asp.net MVC 如何對(duì)所有用戶(hù)輸入的字符串字段做Trim處理,需要的朋友可以參考下2017-06-06
MAUI項(xiàng)目中使用SnackBar與Toast通知功能
這篇文章介紹了MAUI項(xiàng)目中使用SnackBar與Toast通知功能的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02

