手动创建Azure AD应用注册后ASP.NET MVC 5认证失败求助
我之前也碰到过几乎一模一样的问题,结合你描述的细节和异常堆栈来看,核心问题大概率是手动创建的应用注册缺少客户端密钥(Client Secret)配置,导致OpenID Connect中间件无法和Azure AD完成正常的通信验证,进而抛出Microsoft.IdentityModel.Protocols相关的文档检索异常。
问题根源分析
Visual Studio模板自动创建应用注册时,会自动生成一个客户端密钥(对应manifest里的passwordCredentials字段),并把密钥值配置到项目的Web.config中。而你手动创建的应用注册没有添加这个密钥,即使代码里配置了ClientId、TenantId等信息,中间件在尝试获取OpenID Connect配置文档(.well-known/openid-configuration)或验证令牌时,会因为缺少必要的凭据导致请求失败,最终抛出你看到的堆栈异常。
具体解决步骤
1. 给手动创建的应用注册添加客户端密钥
- 登录Azure门户,找到你的目标应用注册,进入「证书和机密」页面
- 点击「新建客户端机密」,设置密钥的过期时间,保存后立即复制生成的密钥值(注意这个值只会显示一次,一定要妥善保存)
- 在项目的
Web.config中添加密钥配置项:<add key="ida:ClientSecret" value="你刚才复制的密钥值" />
2. 更新Startup.Auth.cs代码,添加ClientSecret配置
在OpenIdConnectAuthenticationOptions中补充ClientSecret属性,让中间件能使用密钥完成验证:
private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"]; private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"]; private static string clientSecret = ConfigurationManager.AppSettings["ida:ClientSecret"]; // 新增这行 private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"]; private static string tenant = ConfigurationManager.AppSettings["ida:TenantId"]; private string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant); public void ConfigureAuth(IAppBuilder app) { app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); app.UseCookieAuthentication(new CookieAuthenticationOptions()); app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { ClientId = clientId, Authority = authority, PostLogoutRedirectUri = postLogoutRedirectUri, RedirectUri = postLogoutRedirectUri, ClientSecret = clientSecret, // 新增这行 Notifications = new OpenIdConnectAuthenticationNotifications { AuthenticationFailed = context => { context.HandleResponse(); context.Response.Redirect("/Error?message=" + context.Exception.Message); return Task.FromResult(0); } }, TokenValidationParameters = new TokenValidationParameters { RequireSignedTokens = false, }, }); }
这里要注意:虽然你设置了
RequireSignedTokens = false,但Azure AD默认仍会要求客户端提供密钥完成部分交互流程,缺少密钥会直接导致通信失败。
3. 再次核对重定向URI配置
虽然你说配置正确,但还是建议再检查一遍手动创建的应用注册里的「重定向URI」,确保和项目中PostLogoutRedirectUri、RedirectUri的完全一致,包括HTTPS端口、结尾的斜杠等细节(比如https://localhost:44300/)。
4. 清理并重新生成项目
- 右键项目选择「清理」
- 删除项目根目录下的
bin和obj文件夹 - 重新生成项目后,用IIS Express或本地IIS测试认证流程
补充说明
你提到的manifest中的passwordCredentials字段,就是Azure AD存储客户端密钥的地方,手动创建的应用注册没有这个字段,说明确实未添加密钥——这也是自动创建和手动创建应用注册的核心差异点,补上密钥后就能解决大部分这类认证异常。
内容的提问来源于stack exchange,提问作者vhr

