IIS子目录部署ASP.net MVC应用集成Azure AD出现Nonce验证错误
ASP.NET MVC集成Azure AD部署到IIS子目录报IDX21323错误解决方案
IDX21323错误的核心诱因是IIS子目录部署场景下,OpenID Connect(OIDC)中间件生成的nonce cookie默认路径为站点根路径
/,与当前站点的实际路径/FourthProject不匹配,用户跳转到Azure AD登录完成回调时,浏览器不会携带路径不匹配的nonce cookie,导致服务端验证时无法获取到对应nonce值,触发校验失败。本地运行正常是因为本地调试环境站点默认挂载在根路径,cookie路径匹配无异常。
注意:不要直接关闭RequireNonce校验,该操作会绕过安全校验,存在明确的身份伪造风险,仅做路径适配即可解决问题
- 第一步:显式配置OIDC中间件的路径适配逻辑
在项目的Startup.Auth.cs文件的ConfigureAuth方法中,修改OpenIdConnect认证配置,显式指定cookie路径和回调地址:
public void ConfigureAuth(IAppBuilder app) { app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); app.UseCookieAuthentication(new CookieAuthenticationOptions { // 显式指定Cookie路径为当前站点子目录,也可通过HttpRuntime.AppDomainAppVirtualPath动态获取 CookiePath = "/FourthProject", CookieManager = new SystemWebCookieManager() }); app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { ClientId = "你的Azure AD应用ClientId", Authority = "你的Azure AD Authority地址", // 回调地址必须带子目录路径,和Azure AD门户配置完全一致 RedirectUri = "https://abc.mydominName.com/FourthProject/signin-oidc", PostLogoutRedirectUri = "https://abc.mydominName.com/FourthProject/", CookieManager = new SystemWebCookieManager(), Notifications = new OpenIdConnectAuthenticationNotifications { RedirectToIdentityProvider = context => { if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.Authentication) { context.ProtocolMessage.RedirectUri = "https://abc.mydominName.com/FourthProject/signin-oidc"; } return Task.FromResult(0); } } }); }
第二步:校验Azure AD应用注册的重定向URI配置
登录Azure Portal进入对应AD应用的注册页面,在「身份验证」-「重定向URI」配置项中,确认已添加完整带子目录的回调地址https://abc.mydominName.com/FourthProject/signin-oidc,登出重定向URI也同步配置为带子目录的地址,必须和代码中的配置完全一致,大小写也需要匹配。第三步:排查IIS配置冲突
如果上述配置修改后仍报错,检查是否存在父站点web.config配置继承冲突,在子站点的web.config文件根节点下添加location配置,禁止父站点配置继承到子站点:
<location path="." inheritInChildApplications="false"> <system.web> <!-- 原有system.web配置保持不变 --> </system.web> <system.webServer> <!-- 原有system.webServer配置保持不变 --> </system.webServer> </location>
同时确认子站点对应的应用池.NET Framework版本与项目依赖版本一致,应用池身份对站点目录有正常的读取权限。
内容的提问来源于stack exchange,提问作者Maggy3
相关产品推荐
相关产品推荐

