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
相关产品推荐
相关产品推荐

