asp.net.core网站重启后登陆无效问题(部署在IIS)

  一.问题

  在使用asp.net.core时,把网站发布到IIS后,在后续更新中需要停止网站,然后重启网站,发现已经登陆的用户会退出登陆。过程如下

  1.登陆代码(测试)

 1 [AllowAnonymous]
 2         [HttpGet]
 3         public IActionResult Login([FromServices] ILogger<AccountController> logger)
 4         {
 5             if (User.Identity.IsAuthenticated) //已经登陆跳转
 6             {
 7                 logger.LogInformation("有登陆信息");
 8                 return Redirect("/Home/Index");
 9             }
10             else
11             {
12                 logger.LogInformation("无登陆信息");
13             }
14             return View();
15         }
16         [AllowAnonymous]
17         [HttpPost]
18         public async Task<IActionResult> Login(string acount,string password)
19         {
20             if (acount == "111" && password == "111")
21             {
22                 var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
23                 identity.AddClaim(new Claim(ClaimTypes.Sid,acount));
24                 await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity));
25                 return Redirect("/Home/Index");
26             }
27             return View();
28         }

   2.先登陆网站,在iis内把网站先停止,再启动。现在刷新网页,发现会自动退出登陆,F12查看cookie信息如下

  

可以看到已经跳转到了登陆页面,cookie信息并没有过期

  二.原因

  原因是什么,找了很久原来是.netcore的数据保护问题 详情可以看官方说明 https://docs.microsoft.com/zh-cn/aspnet/core/security/data-protection/introduction?view=aspnetcore-2.2

  简单的来说就是在默认情况下程序每次启动时会生成一个密钥 key, 当你把程序停止时 这个key就会失去,再启动时生成一个新的key,所以之前的登陆信息就会失效。

  三.解决方法

  解决方法:把密钥持久化,可以使用 数据库,redis,文件系统,自定义存储等等方法,对应的方法使用说明:https://docs.microsoft.com/zh-cn/aspnet/core/security/data-protection/implementation/key-storage-providers?view=aspnetcore-2.2&tabs=visual-studio

  简单介绍下文件系统使用

1      services.AddDataProtection()
2                 .PersistKeysToFileSystem(new DirectoryInfo(@"d:\temp-keys\"));

  程序首次启动会在对应文件夹下创建文件,后续就会一直读取文件中的密钥

  密钥文件如下(xml文件)

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <key id="780a229b-dac4-413f-8e7d-1467b2c4997a" version="1">
 3   <creationDate>2019-03-21T06:31:35.979Z</creationDate>
 4   <activationDate>2019-03-21T06:31:35.947Z</activationDate>
 5   <expirationDate>2019-06-19T06:31:35.947Z</expirationDate>
 6   <descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
 7     <descriptor>
 8       <encryption algorithm="AES_256_CBC" />
 9       <validation algorithm="HMACSHA256" />
10       <masterKey p4:requiresEncryption="true" xmlns:p4="http://schemas.asp.net/2015/03/dataProtection">
11         <!-- Warning: the key below is in an unencrypted form. -->
12         <value>D3CSJaTNFoTMqSwRXxQDn36+12Jv5vRA/MVRezbue2CxP5YAJaiCVVrbOS/MPu5UBdOAObPRWz5jUbKAaumjmg==</value>
13       </masterKey>
14     </descriptor>
15   </descriptor>
16 </key>

这是生成的文件 包含激活时间,过期时间,加密方法以及密钥等

 其中还有更多操作大家可以查看官方文档

posted @ 2019-03-21 15:02  灵行寻燕  阅读(570)  评论(0编辑  收藏  举报