.net core 2.0中的持久身份验证Cookie

时间:2017-11-29 17:16:38

标签: .net azure asp.net-core asp.net-core-mvc

最近我在.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);
            });

enter image description here

2 个答案:

答案 0 :(得分:1)

您需要使用data protection来保留会话加密密钥。

在Azure App Service或IIS中(通常在VM或内部部署)托管应用程序时,IIS将在不活动时回收应用程序和应用程序池。因此,如果您的应用在特定时间内没有被点击,它将被关闭并在下次连接时再次启动。

发生这种情况时,将为会话生成新的加密密钥,您之前的会话将无效。

答案 1 :(得分:1)

  

当我在几小时不活动(新浏览器)后重新打开我的网站时,我丢失了我的身份验证cookie,我需要再次登录,但文化cookie按照上一次会话的方式工作。

您的文化Cookie的价值只是urlencoded。由于Tseng说用于散列和加密的机器密钥可能会在某些点自动重新生成。我认为这个问题是由您选择的定价层引起的。对于免费共享层,您的应用程序将在共享基础架构上运行,并且您只有有限的资源(例如CPU时间,RAM,磁盘空间)而没有{{3} }。

SLA

App Service limits

此外,我尝试重新启动网站并在本地回收应用程序池,身份验证cookie仍可按预期工作。对于我在基本定价层下托管的网络应用程序,我直到现在才遇到此问题。