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

ASP.NET Core 6 MVC应用出现MsalUiRequiredException:AADSTS54005问题求助

AADSTS54005授权码重复使用错误排查与解决

问题背景

我正在开发基于ASP.NET Core 6.0 MVC的Web应用,采用OAuth2结合Microsoft Identity服务实现身份认证,服务配置代码如下:

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration)
 .EnableTokenAcquisitionToCallDownstreamApi()
 .AddInMemoryTokenCaches();

builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration);

调试启动应用并尝试访问登录页时,会间歇性出现以下错误:

MsalUiRequiredException: AADSTS54005: OAuth2 Authorization code was already redeemed, please retry with a new valid code or use an existing refresh token.

错误成因

  • 授权码一次性特性冲突:OAuth2协议规定授权码只能被兑换一次,调试过程中如果浏览器缓存了之前的授权回调请求,重复提交已兑换过的授权码就会触发该错误。
  • 内存令牌缓存残留:配置的AddInMemoryTokenCaches()会在应用内存中存储令牌信息,调试重启应用时,浏览器若保留了旧会话Cookie,应用会尝试复用缓存中的令牌相关数据,但对应的授权码早已失效。
  • 浏览器会话未清除:频繁调试重启应用时,浏览器没有清除之前的登录会话,导致应用重启后仍尝试使用旧会话信息获取令牌,触发授权码重复校验。

强制获取新令牌的解决方法

  • 调试时清理浏览器会话:每次重启调试前,清除浏览器的Cookie和缓存,或使用隐私模式打开应用,避免复用旧会话数据。
  • 调试环境临时禁用令牌缓存:开发阶段可临时注释AddInMemoryTokenCaches(),强制每次登录都重新获取授权码和令牌(注意生产环境必须恢复缓存,保障性能)。
  • 配置强制重新认证逻辑:在认证配置中添加调试环境下的强制登录参数,确保每次都获取新授权码:
builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

builder.Services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
    options.Events.OnRedirectToIdentityProvider += context =>
    {
        if (builder.Environment.IsDevelopment())
        {
            // 添加prompt=login参数,强制用户重新登录生成新授权码
            context.ProtocolMessage.Prompt = "login";
        }
        return Task.CompletedTask;
    };
});
  • 重启时清除应用会话状态:在Program.cs中添加调试环境下的会话清理逻辑,或利用Visual Studio的调试设置,确保重启应用时会话状态完全重置。

内容的提问来源于stack exchange,提问作者javacavaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:43:13