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("MyCookieAuthenticationScheme"); } } }
然后,在Startup.cs文件中的Configure要领中将Cokie认证设置举办重写:
app.UseCookieAuthentication(new CookieAuthenticationOptions { Events = new CookieAuthenticationEvents { OnValidatePrincipal = LastChangedValidator.ValidateAsync } });
ASP.NET Core 2.xpublic 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.SignOutAsync("MyCookieAuthenticationScheme"); } } }
然后,将在Startup.cs的ConfigureServices要领中将Cookie处事注册举办设置:
services.AddAuthentication("MyCookieAuthenticationScheme") .AddCookie(options => { options.Events = new CookieAuthenticationEvents { OnValidatePrincipal = LastChangedValidator.ValidateAsync }; });
假如要非粉碎性地更新用户主体,可以挪用context.ReplacePrincipal(),并将context.ShouldRenew属性配置为true。
Cookie配置选项CookieAuthenticationOptions类提供了各类设置选项,在建设时调解Cookie的设置。
ASP.NET Core 1.xClaimsIssuer是由中间件建设的任何声明时利用的Issuer属性。
CookieDomain是提供Cookie的域名。默认环境下,这是发送请求的主机名。欣赏器仅将Cookie提供应匹配的主机名。您大概但愿对此举办调解,以便您的域中的任何主机都可以利用Cookie。譬喻,将Cookie域名配置为.contoso.com,可以利用Cookie的域名有contoso.com、、staging.等。
CookieHttpOnly是一个标识,指定Cookie是否只能由处事器会见。默认为true。假如您的应用措施具有Cross-Site Scripting(XSS)的问题,变动此值大概会导致Cookie被盗用。
CookiePath可用于断绝在沟通主机名上运行的应用措施。假如你有一个应用措施在/app1中运行,并但愿限制发送的Cookie只发送到该应用措施,那么您应该将CookiePath属性配置为/app1。通过这样做,Cookie只合用于对/app1或其下任何内容的请求。
CookieSecure是一个标识,暗示建设的Cookie是否应该被限制为HTTPS,HTTP或HTTPS,或与请求沟通的协议。默认为SameAsRequest。
ExpireTimeSpan是TimeSpan范例,在此时间段之后Cookie将逾期。将当前日期加上此时间段为建设Cookie的到期日期。
SlidingExpiration是一个标识,指示当高出一半的ExpireTimeSpan隔断时,Cookie到期日期是否复位。新的到期日是当前时间加上ExpireTimespan。挪用SignInAsync时,可以利用AuthenticationProperties类配置绝对到期时间。绝对到期时间可以通过限制认证Cookie有效的时间来提高应用措施的安详性。
在Startup.cs文件中的Configure要领中利用CookieAuthenticationOptions的例子如下:
app.UseCookieAuthentication(new CookieAuthenticationOptions { CookieName = "AuthCookie", CookieDomain = "contoso.com", CookiePath = "https://www.jb51.net/", CookieHttpOnly = true, CookieSecure = CookieSecurePolicy.Always });
ASP.NET Core 2.xASP.NET Core 2.x 统一了用于设置Cookie的API。1.x API已被标志为过期,而且在CookieAuthenticationOptions类中引入了一种范例为CookieBuilder新的Cookie属性。发起您迁移到2.x API。
在Startup.cs的ConfigureServices要领中利用CookieAuthenticationOptions的例子如下:
services.AddAuthentication() .AddCookie(options => { options.Cookie.Name = "AuthCookie"; options.Cookie.Domain = "contoso.com"; options.Cookie.Path = "https://www.jb51.net/"; options.Cookie.HttpOnly = true; options.Cookie.SameSite = SameSiteMode.Lax; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; });
耐久Cookie和绝对到期时间