AspNet Core Identity GetExternalLoginInfoAsync始终为Null问题排查
我来帮你排查这个问题——GetExternalLoginInfoAsync()返回null通常是配置环节的细节错误导致的,咱们一步步来解决:
1. 修复配置绑定的拼写错误(最关键的问题)
你在Startup.cs里写的是:
Configuration.GetSection("OpenIdConect").Bind(options)
但appsettings.json里的配置节点是"OpenIdConnect"(多了一个n)!拼写不匹配会导致所有Azure AD的配置项都没有被正确绑定,直接破坏外部登录流程。修正后的代码应该是:
services.AddAuthentication().AddOpenIdConnect(options => { Configuration.GetSection("OpenIdConnect").Bind(options); });
2. 修正appsettings里的布尔值类型错误
你把AutomaticAuthenticate、AutomaticChallenge、RequireHttpsMetadata都写成了字符串(带引号的"false"/"true"),但这些属性是布尔类型,配置绑定的时候会失败,导致默认值生效(比如AutomaticAuthenticate默认是true,会和IdentityServer的认证流程冲突)。修改appsettings.json:
{ "OpenIdConnect": { "ClientId": "<my_client_id>", "Authority": "https://login.microsoft.com/<my_tenant_id>", "PostLogoutRedirectUri": "http://localhost:5000/MyApp/Account", "CallbackPath": "/signin-oidc", "ResponseType": "code id_token", "Scope": "openid profile email", "SignInScheme": "idsrv.external", "AutomaticAuthenticate": false, "AutomaticChallenge": false, "RequireHttpsMetadata": true } }
3. 确认中间件顺序的正确性
ASP.NET Core中间件的执行顺序直接影响认证流程,必须保证以下顺序(在Configure方法中):
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 其他中间件(比如异常处理)... app.UseCookiePolicy(); // 必须在IdentityServer之前 app.UseIdentityServer(); // IdentityServer中间件要先于认证中间件 app.UseAuthentication(); // 认证中间件 app.UseAuthorization(); // 授权中间件 app.UseMvc(); }
如果顺序颠倒,外部登录的Cookie无法被正确读取,GetExternalLoginInfoAsync()就会返回null。
4. 验证Azure AD应用注册的回调地址
确保你在Azure AD应用注册里添加的重定向URI完全匹配你的CallbackPath配置:
- 正确的地址应该是:
http://localhost:5000/signin-oidc(注意协议、端口和路径要和代码一致) - 如果是生产环境,要换成对应的HTTPS地址
5. 检查IdentityServer与ASP.NET Core Identity的兼容性
确认你已经正确执行了IdentityServer的数据库迁移(配置存储和操作存储),并且AddAspNetIdentity<MyAppUser>()已经正确关联了你的用户实体。另外,确保ASP.NET Core Identity的Cookie配置没有和IdentityServer的外部登录Cookie冲突——SignInScheme: "idsrv.external"是IdentityServer默认的外部登录Scheme,这个配置是正确的。
按照以上步骤逐一排查后,重新启动应用,应该就能正常获取外部登录信息了。
内容的提问来源于stack exchange,提问作者Daniel L.

