最近我在.net core 2.0中创建了我的新网站,并且我在身份验证中使用了持久性cookie。我也使用持久性文化cookie来表达语言。
我的网站托管在azure共享池中,但我没有指定任何机器密钥。
问题。 当我在几小时不活动(新浏览器)后重新打开我的网站时,我丢失了我的身份验证cookie,我需要再次登录,但文化cookie按照上一次会话的方式工作。
我还设置 Application Insights可用性以保持我的应用程序热身(从2个不同的位置每10分钟ping一次网站)。
的LoginController
if (this.accountService.ValidateOTP(phoneNumber, otp))
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.MobilePhone, phoneNumber),
new Claim(ClaimTypes.Name, phoneNumber)
};
var userIdentity = new ClaimsIdentity("Custom");
userIdentity.AddClaims(claims);
ClaimsPrincipal userPrincipal = new ClaimsPrincipal(userIdentity);
//await HttpContext.SignOutAsync("AnimalHubInstance");
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
userPrincipal,
new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTime.Now.AddYears(1),
});
}
启动
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(option =>
{
option.LoginPath = new PathString("/Account/Unauthorized");
option.LogoutPath = new PathString("/Account/Logout");
option.Cookie.Name = ".myAuth";
option.ExpireTimeSpan = TimeSpan.FromDays(365);
option.Cookie.Expiration = TimeSpan.FromDays(365);
});
答案 0 :(得分:1)
您需要使用data protection来保留会话加密密钥。
在Azure App Service或IIS中(通常在VM或内部部署)托管应用程序时,IIS将在不活动时回收应用程序和应用程序池。因此,如果您的应用在特定时间内没有被点击,它将被关闭并在下次连接时再次启动。
发生这种情况时,将为会话生成新的加密密钥,您之前的会话将无效。
答案 1 :(得分:1)
当我在几小时不活动(新浏览器)后重新打开我的网站时,我丢失了我的身份验证cookie,我需要再次登录,但文化cookie按照上一次会话的方式工作。
您的文化Cookie的价值只是urlencoded。由于Tseng说用于散列和加密的机器密钥可能会在某些点自动重新生成。我认为这个问题是由您选择的定价层引起的。对于免费和共享层,您的应用程序将在共享基础架构上运行,并且您只有有限的资源(例如CPU时间,RAM,磁盘空间)而没有{{3} }。
SLA:
此外,我尝试重新启动网站并在本地回收应用程序池,身份验证cookie仍可按预期工作。对于我在基本定价层下托管的网络应用程序,我直到现在才遇到此问题。