ADAL.js示例在ASP.NET Core MVC中循环重定向,提示‘User login required’求助
我之前也碰到过一模一样的循环重定向问题,大概率是这几个配置环节出了问题,你可以逐个排查:
重定向URI不匹配(最常见原因)
首先去Azure AD的应用注册里,检查“重定向URI”列表里有没有你当前项目的运行地址——比如本地调试的https://localhost:5001或者部署后的正式域名。ADAL.js默认会把当前页面地址作为回调地址,如果这个地址没在AAD应用里注册,AAD验证完用户身份后,会因为不认可回调地址而拒绝返回有效状态,导致页面再次触发登录流程。
如果你在代码里手动指定了redirectUri,一定要保证它和AAD里注册的完全一致,比如:window.config = { tenant: variables.azureAD, clientId: variables.clientId, redirectUri: window.location.origin, // 这个地址必须在AAD应用注册的重定向URI列表里 cacheLocation: 'localStorage' };登录状态缓存未正确配置
ADAL.js需要依赖缓存来保存用户的登录状态,默认用sessionStorage的话,页面刷新或者跳转后状态很容易丢失,进而触发重新登录。建议显式设置cacheLocation: 'localStorage',这样跨页面的登录状态能持久保留。
另外,页面初始化时要先检查缓存里的用户状态,不要直接触发登录。正确的初始化逻辑应该是这样的:var authContext = new AuthenticationContext(config); // 处理AAD返回的回调 var isCallback = authContext.isCallback(window.location.hash); authContext.handleWindowCallback(); // 回调成功后跳回之前的页面 if (isCallback && !authContext.getLoginError()) { window.location = authContext._getItem(authContext.CONSTANTS.STORAGE.LOGIN_REQUEST); } // 检查缓存中的用户信息,不存在再触发登录 var user = authContext.getCachedUser(); if (!user) { authContext.login(); } else { // 已登录,执行你的业务逻辑 }ASP.NET Core服务器端身份认证中间件干扰
虽然你没加[Authorize]特性,但如果Startup.cs里配置了Azure AD的服务器端身份认证中间件,可能会和ADAL.js的前端认证流程冲突。检查ConfigureServices方法里有没有类似这样的代码,如果不需要服务器端认证,直接注释掉:// 注释掉不需要的服务器端认证配置 // services.AddAuthentication(AzureADDefaults.AuthenticationScheme) // .AddAzureAD(options => Configuration.Bind("AzureAd", options));AAD应用权限配置不足
去应用注册的“API权限”页面,确认已经添加了必要的权限(比如User.Read这种基础权限),并且已经授予了管理员同意(如果是面向整个租户的应用)。如果权限不足,ADAL.js获取令牌失败,也会导致重新触发登录流程。
按照上面的步骤排查一遍,应该就能解决循环重定向的问题了。
内容的提问来源于stack exchange,提问作者Thomas Segato

