Azure AD登录异常:会话过期与请求过长错误排查求助
问题排查与解决方案
我来帮你梳理这两个问题——会话过期和「Bad Request - Request Too Long」错误的排查方向和修复方案,结合你的代码和Azure配置来看,主要是这几个环节没做到位:
一、会话过期问题的修复
你的代码里直接用了Response.Redirect跳转,但结合Azure AD的认证流程,这里存在会话同步的漏洞:
- 缺少Azure AD会话与本地会话的绑定:你只是简单处理了本地会话,但没把Azure AD的认证票据(比如ID Token、会话令牌)和本地会话关联起来。跳转到Home页面时,本地会话还没完成和Azure AD会话的同步,就会被判定为过期。
- 调整代码逻辑:
别再用Response.Redirect,建议改用RedirectToAction,同时把Azure AD的认证信息存入本地会话。修改后的代码示例:public class Logon : Controller { [Authorize] public ActionResult Authenticate() { if (User.Identity.IsAuthenticated) { var userfirstname = User.FindFirst(ClaimTypes.GivenName)?.Value; var userlastname = User.FindFirst(ClaimTypes.Surname)?.Value; // 把Azure AD的ID Token存入本地会话,确保会话同步 Session["AADIdToken"] = HttpContext.GetTokenAsync("id_token").Result; // 跳转到Home首页 return RedirectToAction("Index", "Home"); } return View(); } } - 检查Azure AD会话配置:在Azure AD应用注册的「会话管理」设置里,确认会话超时时间设置合理,并且开启了「保持用户登录」选项(如果需要长期会话)。
二、「Bad Request - Request Too Long」错误的修复
这个错误基本是请求头或Cookie过大导致的,结合你的场景,主要原因和修复方式如下:
- Cookie累积超限:Azure AD认证后会生成多个Cookie(比如
ASP.NET_SessionId、.AspNetCore.Cookies),如果本地IIS的Cookie大小限制过低,就会触发这个错误。 - 调整IIS配置:
- 打开IIS管理器,找到你的站点,进入「配置编辑器」
- 定位到
system.webServer/security/requestFiltering,把requestLimits下的maxQueryString和maxUrl值调高(比如设为8192) - 再定位到
system.web/httpCookies,开启httpOnlyCookies和requireSSL,同时把maxCookieSize调整到4096左右
- 补充Azure AD回复URL:你现在把主页URL和回复URL都设成了
https://mysite/logon/authenticate,但回复URL需要包含所有可能的回调路径。比如https://mysite/Home/Index如果是跳转后的页面,也得添加到Azure AD的回复URL列表里,避免因路径不匹配导致请求参数异常过长。
三、你遗漏的关键配置点
- 回复URL完整性:Azure AD应用注册的「回复URL」必须包含所有应用的回调路径,不能只填登录回调页
- 令牌管理工具:建议用
Microsoft.Identity.Web库来处理Azure AD令牌,它会自动搞定会话同步、令牌刷新,不用手动写容易出错的逻辑 - IIS会话状态匹配:在IIS的「会话状态」设置里,确保会话模式(单服务器用InProc,多服务器用StateServer/SQLServer)和Azure AD的会话超时时间匹配
内容的提问来源于stack exchange,提问作者Jeric John Romero
相关产品推荐
相关产品推荐

