zoukankan      html  css  js  c++  java
  • .net core项目使用Cookie Authentication部署在windows iis上出现登录失效的解决方法

    问题描述:.net core项目使用Cookie Authentication部署在windows iis,登录时保存用户信息在Cookie中,登录一段时间后,登录失效后需重新登录。

    版本.net core 3.0

    问题分析:

    理论上Cookie是保存在设备本地,有效期为1个月,与以前传统的登录方式基本一样,但登录上去后过一段时间登录信息就没了,就会跳转重新登录。
    推测是在.net core中,登录后登录状态在内存中,过一段时间后内存释放了,导致登录失效。

    原始配置信息如下:

    Startup:

            public void ConfigureServices(IServiceCollection services)
            {
                //注册Cookie认证服务
                services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                        .AddCookie(options =>
                        {
                            options.AccessDeniedPath = "/Home/Index";
                            options.LoginPath = "/Account/Login";
                            options.Cookie.Name = "TestMobile";
                            options.Cookie.SameSite = SameSiteMode.None;
                            //不在此处设置Cookie有效期,在登录时写入User时设置
                        });
            }
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                app.UseAuthentication();
                app.UseAuthorization();
    
                app.UseEndpoints(builder =>
                {
                    builder.MapControllers();
                    builder.MapDefaultControllerRoute();
                });
    
            }

    Controller

        [Authorize]
        public ActionResult Index()
        {
            return View()
        }

    登录时保存用户信息到Cookie:

        var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
        identity.AddClaim(new Claim(JwtClaimTypes.Name, user.UserName));
        var principal = new ClaimsPrincipal(identity);
    
        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
            principal,
            new AuthenticationProperties
            {
                IsPersistent = true,
                AllowRefresh = true,
                ExpiresUtc = DateTimeOffset.UtcNow.AddMonths(1),
            });

    解决方案:

    在其他参数都配置好的情况,增加ASP.NET Core中的密钥保存程序,这样配置好之后,就会持久化保存用户登录状态等信息

    密钥保存有多种方式,我自己采用的是文件系统保存。

            public Startup(IConfiguration configuration,
                IWebHostEnvironment webHostEnvironment)
            {
                Configuration = configuration;
                WebHostEnvironment = webHostEnvironment;
            }
    
            public IConfiguration Configuration { get; }
            public IWebHostEnvironment WebHostEnvironment { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                //基于文件系统的密钥存储库(持久性保持密钥)
                services.AddDataProtection()
                        .PersistKeysToFileSystem(new DirectoryInfo($@"{WebHostEnvironment.ContentRootPath}login-keys"));
            }

    官方文档:

    在 ASP.NET Core 中的密钥存储提供程序
    https://docs.microsoft.com/zh-cn/aspnet/core/security/data-protection/implementation/key-storage-providers?view=aspnetcore-2.2&tabs=visual-studio

     转自 https://www.cnblogs.com/gilbert/p/12213224.html

  • 相关阅读:
    IT开发者对Mac钟爱
    POJ 3486 & HDU 1913 Computers(dp)
    基础排序算法
    LeetCode 70:Climbing Stairs
    Qt自己定义事件实现及子线程向主线程传送事件消息
    maven自己主动编译,解决你每次代码改动须要又一次编译的繁琐
    Unity定制 Image、Text的对象生成
    iOS学习4_UITableView的使用
    GTK+重拾--09 GTK+中的组件(一)
    Architecting Android…The clean way?
  • 原文地址:https://www.cnblogs.com/zhangxiaoxia/p/12327442.html
Copyright © 2011-2022 走看看