You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:06:02