.NET 5使用Cookie认证方案时Cookie无法正常添加问题咨询
核心问题及修复方案
问题1:异步签入方法未等待执行
HttpContext.SignInAsync为异步方法,当前同步Action中直接调用未添加等待逻辑,会导致Cookie写入逻辑未执行完成请求就已重定向返回,无Cookie写入响应。
修复方案:将Action改为异步返回类型,添加await关键字等待签入方法执行完成。
问题2:身份标识未指定认证方案
创建ClaimsIdentity时未传入注册的Cookie认证方案名称,会导致身份被识别为未认证状态,签入逻辑直接跳过,不生成Cookie。
修复方案:构造ClaimsIdentity时传入CookieAuthenticationDefaults.AuthenticationScheme作为第二个参数。
修正后控制器代码
[HttpPost] [Route("/Login")] public async Task<IActionResult> Login([Bind] LoginViewModel model) { if (model.Email == "user@fmail.com" && model.PasswordHash == "1234") { var claims = new List<Claim> { new Claim(ClaimTypes.Name, "Bar F Har"), new Claim(ClaimTypes.Email, "user@fmail.com"), new Claim("Age", "25") }; // 传入Cookie认证方案 var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); var claimsPrincipal = new ClaimsPrincipal(claimsIdentity); // 等待异步签入完成 await HttpContext.SignInAsync(claimsPrincipal); return Redirect("/"); } else { return NotFound(); } }
可选补充配置(开发环境适配)
如果上述修改后仍未正常生成Cookie,可补充Cookie安全策略配置适配本地HTTP开发环境:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options => { options.Cookie.Name = "Test.Cookie"; options.LoginPath = "/Login"; options.Cookie.HttpOnly = true; options.Cookie.SameSite = SameSiteMode.Lax; // 本地HTTP开发环境关闭安全传输限制,生产环境建议改为Always options.Cookie.SecurePolicy = CookieSecurePolicy.None; });
内容的提问来源于stack exchange,提问作者kesarling
相关产品推荐
相关产品推荐

