基于路径的App Service+EasyAuth在应用网关后回调报HTTP 500错误
问题描述
我正尝试在应用网关后配置多个基于路径路由的App Service,搭配EasyAuth认证。具体配置为:根应用指向https://my-custom-internal-domain/,App1指向https://my-custom-internal-domain/app1。这些App Service使用不同的Entra ID应用进行EasyAuth认证,因使用内部私有域,未配置自定义域名。
每个应用的authSettingsV2配置如下:
{ "httpSettings": { "forwardProxy": { "convention": "Custom", "customHostHeaderName": "X-Original-Host" } }, "identityProviders": { "azureActiveDirectory": { "registration": { "clientId": "f4a511...", "clientSecretSettingName": "MICROSOFT_PROVIDER_AUTHENTICATION_SECRET", "openIdIssuer": "https://sts.windows.net/d7.../v2.0" }, "enabled": true, "login": { "loginParameters": [ "redirect_uri=https://my-custom-internal-domain/<app>/.auth/login/aad/callback" ] } } }, "login": { "allowedExternalRedirectUrls": [ "https://my-custom-internal-domain/<app>/.auth/login/aad/callback" ] } }
根应用的认证流程正常,用户可成功认证且重定向URI配置正确(网关未设置重写规则,仅在App Service上配置了正向代理)。但访问App1时,登录流程启动后,在/my-custom-internal-domain/app1/.auth/login/aad/callback页面出现HTTP 500错误。查看App Service的EasyAuth错误日志,发现报错信息:
Failed to read the 'AppServiceAuthSession' cookie for site 'my-custom-internal-domain': The signature of the encrypted data is invalid.
推测是Cookie路径配置不当导致认证失败,但不知如何排查与修复。请问如何为非根路径的应用配置EasyAuth认证?该场景是否可行?
解决方案
该场景完全可行,问题核心在于EasyAuth默认生成的Cookie路径为根路径/,导致不同子路径的应用共享了根应用的Cookie,而每个App Service的加密密钥独立,因此验证签名时出现失效错误。需针对非根路径应用调整以下配置:
1. 配置Cookie路径与应用路径匹配
在authSettingsV2中新增cookieSettings节点,指定Cookie的路径为应用对应的子路径(如App1对应/app1/),确保每个应用的Cookie仅在自身路径下生效,避免跨应用冲突:
"cookieSettings": { "path": "/app1/" }
2. 修正重定向URI与允许跳转URL
将配置中的占位符<app>替换为实际路径名app1,确保loginParameters中的redirect_uri和allowedExternalRedirectUrls与应用实际回调路径完全匹配:
"login": { "loginParameters": [ "redirect_uri=https://my-custom-internal-domain/app1/.auth/login/aad/callback" ], "allowedExternalRedirectUrls": [ "https://my-custom-internal-domain/app1/.auth/login/aad/callback" ] }
3. 确认应用网关路由配置
应用网关的路径规则需将/app1/*的请求完整转发至App1,不要启用路径重写,保证App Service能正确识别请求的上下文路径。
4. 同步Entra ID应用注册配置
每个App Service对应的Entra ID应用注册中,必须添加对应的回调URI(如https://my-custom-internal-domain/app1/.auth/login/aad/callback),否则Entra ID会拒绝回调请求。
5. 清除浏览器缓存与Cookie
测试前清除浏览器中对应域名的所有Cookie,避免之前残留的根路径Cookie干扰新配置生效。
App1完整authSettingsV2示例
{ "httpSettings": { "forwardProxy": { "convention": "Custom", "customHostHeaderName": "X-Original-Host" } }, "identityProviders": { "azureActiveDirectory": { "registration": { "clientId": "f4a511...", "clientSecretSettingName": "MICROSOFT_PROVIDER_AUTHENTICATION_SECRET", "openIdIssuer": "https://sts.windows.net/d7.../v2.0" }, "enabled": true, "login": { "loginParameters": [ "redirect_uri=https://my-custom-internal-domain/app1/.auth/login/aad/callback" ] } } }, "login": { "allowedExternalRedirectUrls": [ "https://my-custom-internal-domain/app1/.auth/login/aad/callback" ] }, "cookieSettings": { "path": "/app1/" } }
内容的提问来源于stack exchange,提问作者Franck Cornu

