整合MicrosoftIdentityWebApp与Identity时GetExternalLoginInfoAsync返回Null
GetExternalLoginInfoAsync返回Null的问题 以下是按优先级排列的常见排查方向:
1. 核对回调路径一致性
确保Microsoft认证配置的CallbackPath与Identity默认外部登录回调路由完全匹配,避免路径不匹配导致上下文丢失:
services.AddAuthentication() .AddMicrosoftAccount(options => { options.ClientId = Configuration["Authentication:Microsoft:ClientId"]; options.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"]; options.CallbackPath = "/signin-microsoft"; // 必须与Identity默认的外部登录回调路径一致 });
Identity默认外部登录回调路径为/signin-{provider},这里provider对应Microsoft,所以CallbackPath需设为/signin-microsoft;若自定义了Identity回调路由,需两边同步配置。
2. 验证中间件注册顺序
中间件顺序错误会直接导致外部登录上下文丢失,确保顺序如下:
app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseSession(); // 若启用Session,需在此位置注册 app.UseAuthentication(); // 必须在UseAuthorization之前 app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); // 使用Razor Pages Identity时必须注册 });
3. 检查Session/Cookie配置
外部登录依赖Session或Cookie保存临时登录状态,若配置异常会导致回调时上下文丢失:
services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; });
同时确保app.UseSession()在UseRouting()之后、UseAuthentication()之前注册。
4. 排查Claims处理逻辑
若自定义了IClaimsTransformation中间件或全局Claims处理逻辑,需确认未丢弃外部登录的关键Claims(如sub、nameidentifier)。例如自定义Claims转换器时,需保留原始Claims:
public class CustomClaimsTransformer : IClaimsTransformation { public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) { // 仅添加自定义Claims,不要清空原始Claims集合 var identity = principal.Identity as ClaimsIdentity; identity.AddClaim(new Claim("custom-claim", "value")); return principal; } }
5. 确认Identity Schema配置
检查IdentityOptions中与外部登录相关的Scheme设置:
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); services.Configure<IdentityOptions>(options => { options.DefaultSignInScheme = IdentityConstants.ExternalScheme; // 外部登录必须指定此Scheme options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme; options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme; });
DefaultSignInScheme设为IdentityConstants.ExternalScheme是外部登录上下文被Identity识别的关键。
6. 开启详细日志定位问题
在appsettings.json中启用认证与Identity模块的Debug级日志,查看回调过程中的细节:
{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.Authentication": "Debug", "Microsoft.AspNetCore.Identity": "Debug" } } }
日志会显示外部登录回调时的Claims接收、Session保存等流程,可直接定位到上下文丢失的具体环节。
内容的提问来源于stack exchange,提问作者TyDialexno

