public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); //註冊Cookie認證服務 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(); }
//使用認證中間件 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
var claims = new[] { new Claim("UserName", "Wangdacui") }; var claimsIdentity = new ClaimsIdentity( claims, CookieAuthenticationDefaults.AuthenticationScheme); ClaimsPrincipal user = new ClaimsPrincipal(claimsIdentity); Task.Run(async () => { //登陸用戶,至關於ASP.NET中的FormsAuthentication.SetAuthCookie await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user); //能夠使用HttpContext.SignInAsync方法的重載來定義持久化cookie存儲用戶認證信息,例以下面的代碼就定義了用戶登陸後60分鐘內cookie都會保留在客戶端計算機硬盤上, //即使用戶關閉了瀏覽器,60分鐘內再次訪問站點仍然是處於登陸狀態,除非調用Logout方法註銷登陸。 //注意其中的AllowRefresh屬性,若是AllowRefresh爲true,表示若是用戶登陸後在超過50%的ExpiresUtc時間間隔內又訪問了站點,就延長用戶的登陸時間(其實就是延長cookie在客戶端計算機硬盤上的保留時間), //例如本例中咱們下面設置了ExpiresUtc屬性爲60分鐘後,那麼當用戶登陸後在大於30分鐘且小於60分鐘內訪問了站點,那麼就將用戶登陸狀態再延長到當前時間後的60分鐘。可是用戶在登陸後的30分鐘內訪問站點是不會延長登陸時間的, //由於ASP.NET Core有個硬性要求,是用戶在超過50%的ExpiresUtc時間間隔內又訪問了站點,才延長用戶的登陸時間。 //若是AllowRefresh爲false,表示用戶登陸後60分鐘內無論有沒有訪問站點,只要60分鐘到了,立馬就處於非登陸狀態(不延長cookie在客戶端計算機硬盤上的保留時間,60分鐘到了客戶端計算機就自動刪除cookie) /* await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, user, new AuthenticationProperties() { IsPersistent = true, ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(60), AllowRefresh = true }); */ }).Wait();
if (HttpContext.User.Identity.IsAuthenticated) { //這裏經過 HttpContext.User.Claims 能夠將咱們在Login這個Action中存儲到cookie中的全部 //claims鍵值對都讀出來,好比咱們剛纔定義的UserName的值Wangdacui就在這裏讀取出來了 ViewBag.UserName = HttpContext.User.Claims.First().Value; }
以上親測可用html
警告: ASP.NET Core使用 ASP.NET Core data protection stack 來實現Cookie身份認證。若是在服務器集羣中必須配置 ASP.NET Core Data Protection,有關詳細信息,請參閱 Configuring data protection。若是你的ASP.NET Core站點使用了負載均衡部署了多個實例,就要作ASP.NET Core Data Protection的配置,不然ASP.NET CORE跨多個實例進行Cookie身份認證會失敗。web
還能夠參考:Host ASP.NET Core in a web farm 以及 Share authentication cookies among ASP.NET apps瀏覽器
如何管理ASP.NET Core Data Protection的過時key,能夠查看:Data Protection - how to manage expired key?服務器
前面說了實際上在ASP.NET CORE的Cookie認證中還能夠設置Cookie的名字、是否持久化存儲等,能夠參考以下兩篇官方文檔瞭解:cookie
Using Cookie Authentication without ASP.NET Core Identityapp
Cutting Edge - Cookies, Claims and Authentication in ASP.NET Core負載均衡