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
相关产品推荐
相关产品推荐

