.NET项目引入Google.Apis.Auth抛出System.Web类型加载异常求助
解决方案
根本原因
你当前的问题核心是混用了.NET Framework版本的ASP.NET MVC组件和ASP.NET Core环境:
- 你安装的
Microsoft.AspNet.Mvc 5.2.7、Google.Apis.Auth.OAuth2.Mvc系列组件均为基于.NET Framework的旧版ASP.NET MVC设计,强依赖System.Web程序集,而ASP.NET Core 3.1/5.0完全移除了System.Web相关实现,所以会触发类型加载异常。 - 你已经安装的
Google.Apis.Auth.AspNetCore3才是适配ASP.NET Core 3.0+的官方验证组件,不需要再引入任何Mvc版本的Google Auth包。
修复步骤
步骤1:清理不兼容依赖
卸载以下包:
Microsoft.AspNet.Mvc 5.2.7- 所有
Google.Apis.Auth.Mvc、Google.Apis.Auth.OAuth2.Mvc相关包
保留的有效依赖如下即可:
<PackageReference Include="Firebase.Auth" Version="1.0.0" /> <PackageReference Include="FirebaseDatabase.net" Version="4.0.6" /> <PackageReference Include="Google.Apis.Auth.AspNetCore3" Version="1.55.0" /> <PackageReference Include="Google.Cloud.Firestore" Version="2.4.0" /> <PackageReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.10" /> <PackageReference Include="Microsoft.AspNetCore.Session" Version="2.2.0" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.2" />
步骤2:配置Session服务与Google身份验证
修改Startup.cs的ConfigureServices方法:
public void ConfigureServices(IServiceCollection services) { // 配置Session用于存储用户标识 services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); // 配置Google身份验证 services.AddAuthentication() .AddGoogle(options => { options.ClientId = "你的ClientId"; options.ClientSecret = "你的ClientSecret"; options.Scope.Add("email"); options.Scope.Add("profile"); // 保持和原逻辑一致的回调地址 options.CallbackPath = "/AuthCallback/IndexAsync"; // 替代原FlowMetadata的GetUserId逻辑,验证成功后存储用户标识到Session options.Events.OnTicketReceived = context => { if (context.HttpContext.Session.GetString("user") == null) { context.HttpContext.Session.SetString("user", Guid.NewGuid().ToString()); } return Task.CompletedTask; }; }); services.AddRazorPages(); }
步骤3:调整中间件顺序
修改Startup.cs的Configure方法,确保中间件加载顺序正确:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 必须在身份验证前加载Session中间件 app.UseSession(); // 新增身份验证中间件 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); }
步骤4:删除旧兼容代码
- 删除原来继承自
Google.Apis.Auth.OAuth2.Mvc.FlowMetadata的AppFlowMetadata.cs文件,该逻辑为旧版MVC专属,ASP.NET Core版本组件已经通过事件配置实现了对应功能。 - 删除原来的
AuthCallbackController.cs,Google.Apis.Auth.AspNetCore3已经内置了回调处理逻辑,无需自行实现。
功能使用说明
如果需要获取当前登录用户的标识,直接在控制器/页面中通过HttpContext.Session.GetString("user")读取即可,不需要依赖任何System.Web下的类型。
内容的提问来源于stack exchange,提问作者movsx
相关产品推荐
相关产品推荐

