.net core 3.0 Cookie認證

Startup.cs中的配置

  • ConfigureServices中註冊Cookie認證服務(一行代碼)
public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            //註冊Cookie認證服務
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
        }
  • Configure方法中使用認證中間件(一行代碼)
//使用認證中間件
            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負載均衡

原文地址: https://www.cnblogs.com/OpenCoder/p/8341843.htmlasync

相關文章
相關標籤/搜索