在 http:// ASP.NET Core 中运用Cookie中间件
ASP.NET Core 供应了Cookie中间件来序列化用户主题到一个加密的Cookie中而且在厥后的要求中校验这个Cookie,再现用户而且分配到HttpContext对象的User属性中。假如你想供应本身的登录体式格局和用户数据你可以运用Cookie中间件来完成自力的功用。
增添和设置
第一步是增添Cookie中间件到你的运用中。起首运用nuget增添Microsoft.AspNetCore.Authentication.Cookies 顺序包。然后增添下面的几行代码到Startup.cs文件的Configure要领中,且要在app.UseMvc()之前。
app.UseCookieAuthentication(new CookieAuthenticationOptions() { AuthenticationScheme = "MyCookieMiddlewareInstance", LoginPath = new PathString("/Account/Unauthorized/"), AccessDeniedPath = new PathString("/Account/Forbidden/"), AutomaticAuthenticate = true, AutomaticChallenge = true });
上面的代码片断设置了一下几个选项;
认证计划:这是一个已知中间件的值,当有多个实例的中间件假如你想限定受权到一个实例时这个选项将会起作用。
登录途径:这是当用户试图接见资本但未经由身份考证时,顺序将会将要求重定向到这个相对途径。
制止接见途径:当用户试图接见资本时,但未经由过程该资本的任何受权战略,要求将被重定向到这个相对途径。
自动认证:这个标志表明中间件应当会在每一个要求上举行考证和重修他建立的序列化主体。
自动应战:这个标志标明当中间件认证失利时应当重定向浏览器到登录途径或许制止接见途径。
其他选项包括设置中间件所建立的声明的发行者,中间件存储的cookie称号,Cookie的域和cookie上的种种平安属性。默许情况下Cookie中间件将运用恰当的平安选项,设置HTTPONLY防止cookie在客户端被JavaScript操纵。当要求体式格局为HTTPS时限定Cookie的HTTPS操纵。
建立Cookie
建立Cookie保存本身的信息,必需要初始化一个ClaimsPrincipal(范例)来序列化和保存你想保存的用户信息到Cookie中。每一次的要领挪用都邑在你的Controller(掌握器)中有一个适宜的ClaimsPrincipal对象。
复制代码 代码以下:
await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);
上面的代码将会建立一个加密的Cookie而且增添到当前的要求响应中。AuthenticationScheme明白规定在设置时期
退出
退出当前用户的登录,删除登录的cookie信息,可以在掌握器中挪用下面的要领。
复制代码 代码以下:
await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");
响应后端的变化
正告
一旦cookie建立就会成为身份单一认证的泉源,纵然在背景体系已不可用,中间件也是不知道的,而且始终保持登录直到cookie失效。
Cookie认证中间件在他的选项类中供应了一系列的事宜,个中 ValidateAsync() 事宜可以用来中断和重写cookie认证的考证要领。
考虑到背景用户的数据库中可以会有‘末了的修正时刻'这一列,为了在数据库修正以后你可以废除当前的Cookie,第一当建立这个Cookie时增添一个末了修正的声明并包括当前的值,当数据库中的数据转变时,这个值也同时更新。
完成一个ValidateAsync()的事宜重写你必需写一个具有以下署名的要领。
Task ValidateAsync(CookieValidatePrincipalContext context);
ASP.NET Core 认证在SecurityStampValidator中完成了这个考证。下面是一个相似的例子:
public static class LastChangedValidator { public static async Task ValidateAsync(CookieValidatePrincipalContext context) { // Pull database from registered DI services. var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>(); var userPrincipal = context.Principal; // Look for the last changed claim. string lastChanged; lastChanged = (from c in userPrincipal.Claims where c.Type == "LastUpdated" select c.Value).FirstOrDefault(); if (string.IsNullOrEmpty(lastChanged) || !userRepository.ValidateLastChanged(userPrincipal, lastChanged)) { context.RejectPrincipal(); await context.HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance"); } } }
这些要在Cookie中间件设置时举行注册
app.UseCookieAuthentication(options => { options.Events = new CookieAuthenticationEvents { // Set other options OnValidatePrincipal = LastChangedValidator.ValidateAsync }; });
假如你想非破坏性的更新用户主体,比方,name更新了,要想以不影响平安的体式格局你可以挪用 context.ReplacePrincipal() 而且设置 context.ShouldRenew 为 true 。
掌握Cookie选项
CookieAuthenticationOptions装备了林林总总的设置选项是你可以很好的调治建立的Cookie。
ClaimsIssuer - 被用来在任何中间件建立的属性之上。(看不懂)
CookieDomain - 假如cookie domain被设置为 ** . http:// contoso.com ** 那末 contoso.com, http://www. contoso.com,staging.contoso.com 等等相似如许的域名也会被许可。
CookieHttpOnly - 这个标志指导这个 cookie 只会被服务端接见。默许值是true,修正这个属性将会开放你的运用形成 Cookie 偷窃,形成跨站剧本的bug。
CookiePath - 这个可以用来断绝运行在统一个 host 下的运用。假如你有一个运用运行在 /app1 上,而且想限定 cookie 限定仅仅被发送给本身,那末你应当设置 CookiePath 属性为 /app1 ;Cookie将会邃晓只适用于道 /app1 或许他下面的要求。
ExpireTimeSpan - 这个 TimeSpan 时刻段以后 Cookie 将会逾期。
SlidingExpiration - 这个标志标记了假如超过了逾期时刻的一半后被接见那末Cookie将会被重置。新的逾期时刻将会后移到当前时刻加上ExpireTimespan以后。当挪用 SignInAsync 时可以经由过程 ** AuthenticationProperties ** 设置相对的逾期时刻。经由过程限定考证cookie有用的时刻,相对期满可以进步运用顺序的平安性。
延续性Cookie和相对逾期时刻
您可以愿望经由过程浏览器会话使cookie逾期。或许你也想经由过程相对逾期时刻和认证来完毕cookie,那末你可以在登录认证和建立Cookie时运用HttpContext.Authentication.SignInAsync要领中的AuthenticationProperties参数类完成。AuthenticationProperties类在Microsoft.AspNetCore.Http.Authentication定名空间中。
比方
await HttpContext.Authentication.SignInAsync( "MyCookieMiddlewareInstance", principal, new AuthenticationProperties { IsPersistent = true });
这个代码片断将会完成建立一个认证和响应的Cookie来完成立即浏览器封闭Cookie也能继承保存。任安在cookie属性中的逾期时刻的设置都将会保存下来。假如浏览器封闭时Cookie也逾期了那末在重新启动浏览器是Cookie将会别清算。
await HttpContext.Authentication.SignInAsync( "MyCookieMiddlewareInstance", principal, new AuthenticationProperties { ExpiresUtc = DateTime.UtcNow.AddMinutes(20) });
这段代码将建立一个身份认证和响应的cookie且将延续20分钟。 任安在Cookie options中设置的动态选项都邑被疏忽。 ExpiresUtc 和 IsPersistent 这两个属性是互相自力的。
实在上面bb了那末多,都没用! 不如来个demo
// 1. 在Startup.cs的Configure要领中加上 app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationScheme = "UserAuth", // Cookie 考证计划称号,在写cookie时会用到。 AutomaticAuthenticate = true, // 是不是自动启用考证,假如不启用,则即使客服端传输了Cookie信息,服务端也不会主动剖析。除了明白设置了 [Authorize(ActiveAuthenticationSchemes = "上面的计划名")] 属性的处所,才会剖析,此功用平常用在需要在统一运用中启用多种考证计划的时刻。比方分Area. LoginPath = "/User/Index" // 登录页 }); // 2. 新建UserController // 3. 建立一个测试登录的要领(这里为了轻易测是我用的是get要领,轻易传参要求) public IActionResult Login(int userId, string userName) { WriteUser(userId, userName); return Content("Write"); } private async void WriteUser(int userId, string userName) { var identity = new ClaimsIdentity("Forms"); // 指定身份认证范例 identity.AddClaim(new Claim(ClaimTypes.Sid, userId.ToString())); // 用户Id identity.AddClaim(new Claim(ClaimTypes.Name, userName)); // 用户称号 var principal = new ClaimsPrincipal(identity); await HttpContext.Authentication.SignInAsync("UserAuth", principal, new AuthenticationProperties { IsPersistent = true , ExpiresUtc = DateTime.UtcNow.AddMinutes(20) }); //逾期时刻20分钟 } // 4. 建立一个退出登录的要领 public async Task<ActionResult> Logout() { await HttpContext.Authentication.SignOutAsync("UserAuth"); // Startup.cs中设置的考证计划名 return RedirectToAction("User", "Index"); } // 5. 建立一个猎取cookie用户信息的要领轻易挪用 private int GetUserId() { //var userName = User.Identity.Name; //猎取登录时存储的用户称号 var userId = User.FindFirst(ClaimTypes.Sid).Value; // 猎取登录时存储的Id if (string.IsNullOrEmpty(userId)) { return 0; } else { return int.Parse(userId); } } // 或许写一个测试Action public JsonResult CheckLogin() { var userName = User.Identity.Name; //猎取登录时存储的用户称号 var userId = User.FindFirst(ClaimTypes.Sid).Value; // 猎取登录时存储的Id return Json({UserId:userId,UserName:userName}); } // 6. 以上是加密的体式格局假如直接写彷佛也是可以的 HttpContext.Response.Cookies.Append("Key", "Value");
以上就是如安在ASP.NET Core中运用Cookie中间件的细致引见的细致内容,更多请关注ki4网别的相干文章!