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

ASP.NET Core 2 OIDC中间件代理请求返回401后不触发挑战

解决.NET Core 2中OIDC认证代理不触发登录重定向的问题

我帮你分析下这个问题——在.NET Core 2.x里OIDC认证代理只返回401、不触发登录重定向,其实是因为框架对认证中间件的配置逻辑做了不小的调整,和1.1版本的写法差异很大。下面是适配2.x版本的正确配置方案:

1. 先在ConfigureServices里正确注册认证服务

你需要先明确认证方案的默认配置,同时把Cookie和OIDC认证服务都注册好:

public void ConfigureServices(IServiceCollection services)
{
    // 注册认证服务,指定默认的Cookie方案存储用户信息,挑战时用OIDC方案
    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    // 添加Cookie认证,用于保存登录后的用户凭证
    .AddCookie()
    // 配置OpenID Connect(谷歌登录)的参数
    .AddOpenIdConnect(options =>
    {
        options.ClientId = "你的谷歌ClientId";
        options.ClientSecret = "你的谷歌ClientSecret";
        options.Authority = "https://accounts.google.com";
        options.ResponseType = OpenIdConnectResponseType.Code;
        options.SaveTokens = true;
        options.CallbackPath = "/signin-oidc"; // 谷歌回调的路径,要和控制台配置一致
    });

    // 如果是代理项目,记得添加反向代理服务
    services.AddProxy();
}

2. 调整Configure中的中间件顺序

.NET Core 2.x对中间件顺序要求很严格,必须把UseAuthentication放在代理或MVC中间件之前,这样才能在请求被代理前完成认证检查:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // 先启用认证中间件,这是触发挑战的前提
    app.UseAuthentication();

    // 配置代理路由,拦截所有请求并做认证检查
    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapProxy(proxy =>
        {
            proxy.Use(async (context, next) =>
            {
                // 检查用户是否已认证
                if (!context.User.Identity.IsAuthenticated)
                {
                    // 触发OIDC认证挑战,自动重定向到谷歌登录页
                    await context.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme);
                    return;
                }
                await next();
            });
            // 设置你要代理到的后端服务地址
            proxy.To("https://你的后端服务地址");
        });
    });
}

关键差异点说明

  • .NET Core 1.1里直接用UseOpenIdConnectMiddleware就能启用OIDC,但2.x必须通过AddAuthentication先注册服务,再用UseAuthentication启用中间件。
  • 必须指定DefaultChallengeScheme为OIDC方案,否则调用ChallengeAsync时会默认返回401,而不会触发重定向。
  • 中间件顺序绝对不能乱,UseAuthentication一定要放在所有需要认证的中间件前面,不然认证检查会在代理请求之后执行,自然不会触发重定向。

按照上面的方式调整代码后,应该就能恢复1.1版本中自动重定向到谷歌登录页的功能了。

内容的提问来源于stack exchange,提问作者Sarmu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:06:14