我试图获得持久连接,因此用户只需要使用一次密码。我已经使用过这个文档:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?tabs=aspnetcore2x但是用户在一段时间后仍然会断开连接。
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
principal,
new AuthenticationProperties
{
IsPersistent = true
});
如何才能获得真正持久的连接?
答案 0 :(得分:1)
根据文档的说法,IsPersistent授予的持久性只是意味着认证将通过浏览会话持续存在(即,即使在浏览器关闭时也会保留)。您需要Persistence 和的组合来设置Cookie的到期时间。可以使用 ExpireTimeSpan 选项通过CookieAuthenticationOptions (MSDN)设置Cookie的到期时间。
如果没有持久性,可以使用AuthenticationOptions中的 ExpiresUtc 选项设置身份验证的到期时间,
答案 1 :(得分:0)
实施持久性cookie身份验证时,您应该注意的几点。
在Startup.cs中为cookie配置滑动到期时间。如果您显式设置所需的值并且不使用默认设置,将会更加清楚。
private void ConfigureAuthentication(IServiceCollection services)
{
services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
// true by default
options.SlidingExpiration = true;
// 14 days by default
options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
});
}
当用户选中标志“记住我”时,将cookie配置为在浏览器会话中持久存在并设置绝对到期时间(只要您愿意)。此设置将覆盖SlidingExpiration和ExpireTimeSpan。在登录操作中:
List<Claim> claims = new List<Claim>();
// Prepare user claims...
var userIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
AuthenticationProperties authenticationProperties = new AuthenticationProperties() { IsPersistent = model.RememberMe };
if (model.RememberMe)
{
// One month for example
authenticationProperties.ExpiresUtc = DateTimeOffset.UtcNow.AddMonths(1);
}
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, authenticationProperties);
配置数据保护。在旧的经典asp.net网络表单中记住machineKey。否则,将在每个IIS应用程序池重新启动后重置cookie。您应该在Startup.cs中进行身份验证之前配置数据保护。要将密钥存储在应用程序的根文件夹中:
private void ConfigureDataProtection(IServiceCollection services, IWebHostEnvironment environment)
{
var keysDirectoryName = "Keys";
var keysDirectoryPath = Path.Combine(environment.ContentRootPath, keysDirectoryName);
if (!Directory.Exists(keysDirectoryPath))
{
Directory.CreateDirectory(keysDirectoryPath);
}
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(keysDirectoryPath))
.SetApplicationName("YourApplicationName");
}
来自文档: