一.问题

  在使用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. Shiro授权认证原理和流程

    先来张图: 这是一张shiro的功能图: Authentication: 身份认证/登录,验证用户是否拥有相应的身份 Authorization: 授权/权限验证,验证某个已认证的用户是否拥有某个权限 ...

  2. python网页问题

    #django-admin不是个命令 添加环境变量 D:\Python36\Scripts #localhost加载失败 命令行 python manage.py runserver 0.0.0.0: ...

  3. Ubantu 14.04下安装高版本cmake

    Ubantu14.04 下自带的cmake版本比较低(默认为2.8),这里我们从源码编译高版本cmake: 先卸载电脑上安装的cmake (如何已安装的话): sudo apt-get autorem ...

  4. 解决maven 无法下载java-memcached的依赖问题

    1.进入https://github.com/gwhalin/Memcached-Java-Client/downloads 下载java-memcached的jar包. 2.使用cmd进入maven ...

  5. HDU 1556 Color the ball【树状数组】

    题意:给出n个区间,每次给这个区间里面的数加1,询问单点的值 一维的区间更新,单点查询,还是那篇论文里面讲了的 #include<iostream> #include<cstdio& ...

  6. .startsWith和endsWith的使用方法与说明

    a.startsWith(b) --判断字符串a,是不是以字符串b开头 a.endsWith(b) --判断字符串a,是不是以字符串b结尾

  7. vue项目,封装api并使用

    封装api index.js let uploadBase = '' if(process.env.NODE_ENV === 'production'){ uploadBase = 'https:// ...

  8. java中,length,length(),size()区别

    length——数组的属性: length()——String的方法: size()——集合的方法:

  9. shell 特殊字符

    shell 基础 # 当做注释的比较多 : 命令分隔符,在同一行上写两个或两个以上的命令 :: 是case 代码块的结束符 . 点作为文件名的一部分 隐藏文件 目录名 点是正则表达式中的匹配字符 '' ...

  10. CentOS 6.5 安装 ffmpeg

    CentOS 6.5 安装 ffmpeg 满满的坑   http://download.videolan.org/pub/videolan/x264/snapshots/     安装ffmpeg   ...