使用Authorize特性时Facebook登录重定向至错误URL的问题
问题根源
Facebook登录回调会自动在URL末尾追加#_=_片段,当从该回调页面跳转至Home/Index时,浏览器会保留这个片段。再加上你当前的认证逻辑是自行生成JWT并存入Cookie,要么是认证中间件未配置读取该Cookie,要么是默认认证机制不识别自定义Cookie,最终导致带片段的请求被[Authorize]拦截。Google登录正常是因为其回调URL无此片段,认证流程未受干扰。
解决方案
方法一:跳转时清除URL片段
直接在ExternalLoginCallback中生成绝对URL跳转,彻底移除多余的#_=_:
// 替换原有return语句 var homeUrl = $"{Request.Scheme}://{Request.Host}{Url.Action("Index", "Home")}"; return Redirect(homeUrl);
方法二:使用Identity内置登录机制(推荐)
放弃自行生成JWT存Cookie的方式,改用ASP.NET Core Identity的SignInManager处理登录,这样[Authorize]能直接识别官方认证Cookie,不受URL片段影响:
修改ExternalLoginCallback代码,删除生成JWT和存Cookie的部分,替换为:
await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home");
方法三:配置中间件读取Cookie中的JWT(若必须使用JWT)
如果坚持使用JWT,需配置认证中间件从Cookie读取Token。在Program.cs/Startup.cs中添加:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { // 填入你的JWT验证参数 options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "你的Issuer", ValidAudience = "你的Audience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("你的密钥")) }; // 从AuthToken Cookie中读取Token options.Events = new JwtBearerEvents { OnMessageReceived = context => { context.Token = context.Request.Cookies["AuthToken"]; return Task.CompletedTask; } }; });
同时给HomeController的[Authorize]指定认证方案:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
推荐优先使用方法一+方法二,既解决URL片段问题,又遵循官方认证流程,减少自定义逻辑带来的兼容性问题。
内容的提问来源于stack exchange,提问作者angie
相关产品推荐
相关产品推荐

