迁移MS Identity认证至Asp.Net Core5报错,如何追踪中间件并开日志?
问题描述
我正在尝试在C#中对接login.microsoftonline.com实现认证功能。先在portal.azure.com注册了测试应用,通过其“Quickstart”自动生成了一个ASP.Net Core 3.1示例项目,配置的重定向URI如下:
https://localhost:44321/signin-oidc https://localhost:44321/ https://localhost:44368/ https://localhost:5001
该自动生成的ASP.Net Core 3.1项目编译运行正常,可完成认证。
之后我将该项目中的代码复制到另一个ASP.Net Core 5项目中,此项目已成功使用ASP.Net Core Identity实现本地账户(基于ASP.Net Core Identity数据库)及Google OAuth2认证,我希望用Microsoft认证实现同样的效果,但操作后浏览器出现无帮助的错误提示:
"Error loading external login information"
问题: 如何追踪MS Identity和/或OpenID Connect中间件的底层运行过程?是否有办法启用“详细日志”?
以下是报错项目的Startup.cs代码片段:
using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Microsoft.AspNetCore.Authorization; ... using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc.Authorization; ... using Microsoft.Identity.Web; using Microsoft.Identity.Web.UI; ... public void ConfigureServices(IServiceCollection services) { // MS Identity Store: 这部分正常工作,和OpenID Connect问题无关... services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection") )); services.AddDatabaseDeveloperPageExceptionFilter(); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); // 从可正常运行的示例中复制的"AzureAd"配置已放入appsettings.json services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd")); services.AddControllersWithViews(options => { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(policy)); }); services.AddRazorPages() .AddMicrosoftIdentityUI(); ... public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization();
解决方案:启用详细日志与排查步骤
一、启用Microsoft Identity和OpenID Connect的详细日志
ASP.NET Core中可以通过配置日志级别捕获中间件的底层运行细节:
- 修改
appsettings.Development.json,添加或更新日志配置:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning", // 启用以下类别的详细日志 "Microsoft.AspNetCore.Authentication": "Debug", "Microsoft.Identity.Web": "Debug", "Microsoft.IdentityModel": "Debug" } } }
Microsoft.AspNetCore.Authentication:捕获所有认证中间件的流程日志,包括OAuth2/OpenID Connect的跳转、回调、令牌验证等步骤Microsoft.Identity.Web:针对Microsoft Identity Web库的详细日志Microsoft.IdentityModel:捕获令牌解析、签名验证等底层安全操作日志
- 确保控制台日志输出配置(ASP.NET Core 5的Program.cs):
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.ClearProviders(); logging.AddConsole(); // 确保控制台输出日志 logging.AddDebug(); // 可选:添加Debug输出方便调试 }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
启动项目后,控制台会输出认证流程的每一步细节,包括回调时的请求参数、令牌内容、错误信息等。
二、额外排查点(结合你的迁移场景)
除了日志,还可以检查以下常见问题:
- 重定向URI配置:确保Azure Portal中注册的应用添加了当前ASP.NET Core 5项目的
signin-oidc回调地址(比如项目运行在https://localhost:5001,需添加https://localhost:5001/signin-oidc),3.1项目的端口可能和5.0项目不同,这是高频错误点。 - 认证Scheme冲突:项目已集成Identity和Google OAuth2,需明确指定Scheme避免冲突:
services.AddAuthentication(options => { options.DefaultScheme = IdentityConstants.ApplicationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd")) .AddIdentityCookies(); // 确保Identity的Cookie认证正常工作
- 回调路由检查:确认项目中
signin-oidc路由正常(Microsoft Identity Web会自动注册,但自定义路由规则可能影响)。
内容的提问来源于stack exchange,提问作者paulsm4
相关产品推荐
相关产品推荐

