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

Cookie认证失效:User.Identity.IsAuthenticated始终返回false

问题:User.Identity.IsAuthenticated始终返回false,但Cookie存在

用户登录后,程序能检测到.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:44:53