Cookie认证失效:User.Identity.IsAuthenticated始终返回false
用户登录后,程序能检测到.AspNetCore.Cookies Cookie,但User.Identity.IsAuthenticated一直为false,导致订单页面无法获取用户身份信息,无法完成下单功能。
解决方案
1. 确认Cookie认证中间件配置
在Program.cs中必须正确配置Cookie认证中间件,且顺序不可颠倒:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Login"; options.ExpireTimeSpan = TimeSpan.FromMinutes(60); options.SlidingExpiration = true; }); // 必须先启用认证,再启用授权 app.UseAuthentication(); app.UseAuthorization();
如果中间件顺序错误或未配置AddAuthentication,ASP.NET Core无法解析Cookie中的身份信息。
2. 验证ClaimsIdentity的认证类型
登录时创建ClaimsIdentity必须指定与中间件一致的认证方案(你的代码此处已正确,但需确认一致性):
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
3. 替换LoginPartial中的Cookie检测逻辑
不要直接通过Cookie存在判断登录状态,改用官方身份验证API:
@{ bool isAuthenticated = User.Identity.IsAuthenticated; } <ul class="navbar-nav"> @if (isAuthenticated) { <ul class="navbar-nav"> <li class="nav-item"> <form id="logoutForm" method="post" asp-page="/Logout"> <button type="submit" class="nav-link btn btn-link text-dark" onclick="return confirm('Are you sure you want to log out?')">Logout</button> </form> </li> <li class="nav-item"> <a class="nav-link text-dark" asp-page="/ShoppingCart">Shopping Cart</a> </li> <li class="nav-item"> <a class="nav-link text-dark" asp-page="/Profile">Profile Page</a> </li> </ul> } else { <li class="nav-item"> <a class="nav-link text-dark" asp-page="/Register">Register</a> </li> <li class="nav-item"> <a class="nav-link text-dark" asp-page="/Login">Login</a> </li> } </ul>
4. 订单页增加身份验证检查
在OrderModel的OnGet方法中先验证用户是否已认证,避免空引用:
public void OnGet() { CartItems = _shoppingCartService.GetCartItems(); TotalPrice = CartItems.Sum(item => item.Price); if (!User.Identity.IsAuthenticated) { Response.Redirect("/Login"); return; } var user = _userManager.GetCurrentUser(HttpContext.User); AccountStatus = user.Role; if (AccountStatus == "Premium") { DeliveryFee = 0; FreeAccessory = GetRandomAccessory(); } else { DeliveryFee = 5; } }
5. 检查GetCurrentUser方法实现
确保UserManager.GetCurrentUser能正确从ClaimsPrincipal提取用户信息:
public User GetCurrentUser(ClaimsPrincipal user) { if (!user.Identity.IsAuthenticated) return null; var userIdStr = user.FindFirstValue(ClaimTypes.NameIdentifier); if (!int.TryParse(userIdStr, out var userId)) return null; return _userRepository.GetUserById(userId); }
内容的提问来源于stack exchange,提问作者Lachezar Mitov
相关产品推荐
相关产品推荐

