You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手动创建Azure AD应用注册后ASP.NET MVC 5认证失败求助

解决ASP.NET MVC 5手动创建Azure AD应用注册后的认证异常问题

我之前也碰到过几乎一模一样的问题,结合你描述的细节和异常堆栈来看,核心问题大概率是手动创建的应用注册缺少客户端密钥(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:57:56