一.问题

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

  1.登陆代码(测试)

 [AllowAnonymous]
[HttpGet]
public IActionResult Login([FromServices] ILogger<AccountController> logger)
{
if (User.Identity.IsAuthenticated) //已经登陆跳转
{
logger.LogInformation("有登陆信息");
return Redirect("/Home/Index");
}
else
{
logger.LogInformation("无登陆信息");
}
return View();
}
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Login(string acount,string password)
{
if (acount == "" && password == "")
{
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim(ClaimTypes.Sid,acount));
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity));
return Redirect("/Home/Index");
}
return View();
}

  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

  简单介绍下文件系统使用

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

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

  密钥文件如下(xml文件)

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

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

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

asp.net.core网站重启后登陆无效问题(部署在IIS)的更多相关文章

  1. 【ASP.NET Core快速入门】(二)部署到IIS

    配置IIS模块 ASP.NET Core Module载地址:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/asp ...

  2. ASP.NET Core中代码使用X509证书,部署到IIS上后报错:System cannot find the specified file 的解决办法(转载)

    问: I am trying to embrace the mysteries of SSL communication and have found a great tutorial on this ...

  3. ASP.NET Core 网站在Docker中运行

    Docker作为新一代的虚拟化方式,未来肯定会得到广泛的应用,传统虚拟机的部署方式要保证开发环境.测试环境.UAT环境.生产环境的依赖一致性,需要大量的运维人力,使用Docker我们可以实现一次部署, ...

  4. docker 初识之二(简单发布ASP.NET Core 网站)

    在发布ASP.NET Core网站以前,先介绍一下DaoCloud 一个免费的docker云容器服务平台.登陆官方网站,创建一台docker主机,这台主机有120分钟的使用时间,对于鄙人学习使用正好合 ...

  5. ASP.NET CORE网站部署到 windows server 的IIS 上去

    章基于我自己经验的一个总结,在windows服务器上部署asp.net core网站.环境是 windows server 2012数据中心版本 第一步先安装 IIS 服务器 接下来就是一路下一步,然 ...

  6. ASP.NET Core 网站发布到Linux服务器

    长期以来,使用.NET开发的应用只能运行在Windows平台上面,而目前国内蓬勃发展的互联网公司由于成本的考虑,大量使用免费的Linux平台,这就使得.NET空有一身绝技但无法得到广大的施展空间,.N ...

  7. ASP.NET Core 网站发布到Linux服务器(转)

    出处;ASP.NET Core 网站发布到Linux服务器 长期以来,使用.NET开发的应用只能运行在Windows平台上面,而目前国内蓬勃发展的互联网公司由于成本的考虑,大量使用免费的Linux平台 ...

  8. .Net Core 3 骚操作 之 用 Windows 桌面应用开发 Asp.Net Core 网站

    前言 曾经在开发 Asp.Net 网站时就在想,为什么一定要把网站挂到 IIS 上?网站项目的 Main 函数哪儿去了?后来才知道这个 Main 函数在 w3wp.exe 里,这也是 IIS 的主进程 ...

  9. ASP.NET Core搭建多层网站架构【14-扩展之部署到IIS】

    2020/02/03, ASP.NET Core 3.1, VS2019, IIS 10, dotnet-hosting-3.1.1-win.exe 摘要:基于ASP.NET Core 3.1 Web ...

随机推荐

  1. pgpool-II在故障切换过程中是如何选举新主节点的

    在pgpool的源代码中有有一个pgpool_main.c文件,在该文件中有一个pgpool的主函数pgpoolmain控制着pgpool的运行及相关操作. libpcp_ext.h文件中定义了pgp ...

  2. hiho150周 - 动态规划*

    题目链接 一个n*m的迷宫由‘.’和'b'组成,从(1,1)走到(n,m),只能向右或者向下走,但遇到‘b’时才能改变方向,开始时方向向右. 问到达(n,m)至少改变几个位置上的值 /******** ...

  3. 常用类Math,StringBuffer,包装类,Date

    ----------- StringBuffer --------------- StringBuffer是字符串缓冲区. 是一个容器. 特点: 1,长度是可变化的. 2,可以直接操作多个数据类型. ...

  4. 洛谷3627 [APIO2009]抢掠计划

    题目描述 输入格式: 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表示第 i 条道路的起点 ...

  5. ajax 不执行

    1.get形式访问: 一个相同的URL 只有一个结果,所以 第二次访问的时候 如果 URL字符串没变化 浏览器是 直接拿出了第一次访问的结果,post则不会 解决办法: 1.url+new Date( ...

  6. 2015,鬼王Xun和GGL比赛,带给我们无尽的欢乐

    一如既往的风格,正文之前,先扯蛋~     这篇文章好久就想写了,一直没有动笔,最近在忙于Android和iOS等技术研究,又忙于金融投资等方面的学习和写作.这个周末,把技术进度延缓了点,把很多闲杂的 ...

  7. HTTP——学习笔记(2)

    HTTP协议通信双方一定是客户端和服务器端,而且一定是由客户端发出请求,由服务器接受请求 客户端发送的报文的构成: 服务器端收到请求后响应的报文构成: 客户端向服务器端发送请求有多种方法: get:获 ...

  8. [terry笔记]11gR2_DataGuard搭建_拷贝数据文件

    11gR2搭建dataguard环境: 自己做的实验,后续按照rman模式搭建.主备切换.模式调整等实验会陆续发上来. primary: OS:oel 6.4 database:11.2.0.4.0 ...

  9. ASP.NET-跨站伪造请求CSRF

    经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击,在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可Html.Ant ...

  10. 洛谷 P2970 [USACO09DEC]自私的放牧Selfish Grazing

    P2970 [USACO09DEC]自私的放牧Selfish Grazing 题目描述 Each of Farmer John's N (1 <= N <= 50,000) cows li ...