You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.Net Core 2 Azure应用服务认证随机超时问题求助

解决Azure App Service上ASP.NET Core 2认证随机超时问题

我之前也帮几个开发者处理过类似的Azure App Service上ASP.NET Core认证随机失效的问题,结合你的描述,给你梳理几个重点排查方向:

  • 检查App Service实例的异常重启:哪怕服务器负载很低,Azure App Service也可能因为底层维护、健康检查触发或者自动缩放(哪怕是单实例的意外重启)导致应用重启。每次重启如果数据保护密钥没正确持久化,所有现有认证Cookie都会直接失效。你可以去Azure门户的「App Service -> 诊断和解决问题 -> 可用性和性能」里查看重启历史记录,对比用户报告的超时时间点,看看有没有对应上的重启事件。

  • 彻底确认数据保护密钥的持久化配置:ASP.NET Core 2默认的密钥存储是临时内存,重启就会丢失。你提到把密钥持久化到文件系统,但要注意Azure App Service的本地文件系统是实例级临时存储——每个实例有自己的独立存储,而且实例重启后会被清空,多实例部署的话更是无法共享密钥。正确的做法是把密钥持久化到Azure Blob存储或者Azure Key Vault,示例配置代码如下:

    services.AddDataProtection()
        .PersistKeysToAzureBlobStorage(new Uri("你的Blob存储路径"))
        .SetApplicationName("你的应用名称");
    

    另外务必确保SetApplicationName设置了固定的、全环境一致的名称,否则数据保护会认为是不同应用,无法解密之前生成的Cookie。

  • 检查认证Cookie的核心配置:默认的Cookie配置可能存在过期时间过短、滑动失效未开启等问题,你可以明确配置这些参数:

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        {
            options.SlidingExpiration = true; // 用户活跃时自动延长Cookie有效期
            options.ExpireTimeSpan = TimeSpan.FromHours(8); // 根据业务需求调整时长
            options.Cookie.SameSite = SameSiteMode.Lax; // 避免跨域场景下的Cookie失效
            options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // HTTPS站点强制使用Secure Cookie
        });
    

    同时要确认Cookie的Domain和Path设置是否符合你的应用部署场景,比如有子域名或虚拟路径时要对应配置。

  • 排查会话状态的一致性问题:如果你的应用依赖会话状态,ASP.NET Core 2默认的内存会话存储在多实例部署时会导致会话不一致。建议把会话存储切换到Azure Redis缓存或者Azure SQL数据库,确保所有实例共享会话数据,示例配置:

    services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromHours(8);
        options.Cookie.SameSite = SameSiteMode.Lax;
        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
    });
    // 若使用Redis缓存
    services.AddStackExchangeRedisCache(options =>
    {
        options.Configuration = "你的Redis连接字符串";
        options.InstanceName = "你的应用名称";
    });
    
  • 开启ARR亲和性(多实例场景):如果你的应用是多实例部署,没有开启ARR亲和性的话,用户的请求可能被随机分发到不同实例,导致认证状态不匹配。你可以在Azure门户的「App Service -> 设置 -> 配置 -> 常规设置」里开启ARR亲和性,确保同一个用户的请求始终路由到同一个实例(直到实例重启)。

  • 启用详细日志定位问题:在appsettings.json里添加认证和数据保护相关的调试日志,方便问题发生时追踪细节:

    "Logging": {
        "LogLevel": {
            "Microsoft.AspNetCore.Authentication": "Debug",
            "Microsoft.AspNetCore.DataProtection": "Debug"
        }
    }
    

    然后通过Azure门户的「App Service -> 日志流」实时查看日志,或者下载日志文件,当用户报告超时问题时,重点查看是否有「Cookie解密失败」「密钥找不到」这类错误信息。

你之前把密钥持久化到文件系统后问题频率降低,大概率是减少了密钥丢失的次数,但因为Azure本地文件系统的不稳定性,还是会出现随机失效的情况。优先完成数据保护密钥到Blob存储或Key Vault的持久化配置,再结合上面的其他排查点,应该能彻底解决这个问题。

内容的提问来源于stack exchange,提问作者b.pell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:18:43