为了账号安全,请及时绑定邮箱和手机立即绑定

cookie 身份验证问题 ASP.NET CORE 2.1。AWS 负载均衡

cookie 身份验证问题 ASP.NET CORE 2.1。AWS 负载均衡

C#
蝴蝶不菲 2022-08-20 16:09:55
我已将 ASP.NET 核心 2.1 应用程序部署在 Docker 容器中的 AWS 负载均衡器后面。当我尝试从登录页面登录应用程序时。我得到 InvalidOperationException,理由如下:未指定身份验证方案,并且未找到 DefaultChallengeScheme。但是当我再次点击相同的URL时,它实际上移动到正确的页面并工作了一段时间,然后再次抛出HTTP状态为500的相同异常,并且在第二次尝试打开同一页面后,它成功了。有趣的是,Chrome并不像IE那样健壮:如果IE在异常后无法恢复,Chrome总是在随后提交页面时返回404,这会产生上述异常。因此,如果有人能够为我提供如何补救这种情况的想法,我将不胜感激 显然问题与身份验证有关,但我无法弄清楚应该做什么。以下是Startup.cs中的ConfigalServices()的相关练习:        string appname = "MyApp";        var redis = ConnectionMultiplexer.Connect(Configuration.GetConnectionString("RedisConnection"));        services.AddDataProtection()            .SetApplicationName(appname)            .PersistKeysToRedis(redis, "DataProtectionKeys")            .ProtectKeysWithCertificate(LoadCert(Configuration));        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);        services.AddAuthentication( CookieAuthenticationDefaults.AuthenticationScheme)                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,                    options =>                    {                         options.LoginPath = new PathString("/Area/Ctrl/Login");                        options.LogoutPath = new PathString("/Area/Ctrl/Logout");                        options.Cookie.IsEssential = true;                    });        services.AddDistributedRedisCache(o =>        {            o.Configuration = Configuration.GetConnectionString("RedisConnection");        });        services.AddSession(options =>        {            options.Cookie.Name = appname;            options.IdleTimeout = TimeSpan.FromSeconds(600);        });以下是Startup.cs中的Configor()中的相关代码:        app.UseForwardedHeaders();        app.UseHttpsRedirection();        app.UseStaticFiles();        app.UseAuthentication();        app.UseSession();        app.UseMvc(routes =>        {            routes.MapRoute(             name: "areas",             template: "{area:exists}/{controller=Ctrl}/{action=Login}/{id?}"           );        }); 
查看完整描述

1 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

好的,现在一切正常 :)。这就是与众不同之处:

  1. 如果应用程序处于负载平衡状态,则所有实例都必须共享数据保护加密密钥(例如,使用相同的密钥环)。因此,Redis和证书出现了。会话也应共享。因此,Redis再次出现。

  2. 用于调用的证书应正确加载。如果它无法加载,请不要进行该调用,但这确实是个坏主意。只要弄清楚为什么它没有加载。ProtectKeysWithCertificate()

  3. 为了避免在自定义身份验证中抛出无效操作异常 HttpContext。应在登录操作中手动分配用户。

关于证书的一件重要事情:数据保护模块仅支持具有 CAPI 私钥的证书。CNG被抛在后面。


查看完整回答
反对 回复 2022-08-20
  • 1 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信