ASP.NET Core 身份验证 cookie 只收到一次

Posted

技术标签:

【中文标题】ASP.NET Core 身份验证 cookie 只收到一次【英文标题】:ASP.NET Core authentication cookie only received once 【发布时间】:2017-12-31 14:15:56 【问题描述】:

我正在使用 ASP.NET Core 开发应用程序,并且正在使用自定义 Cookie 身份验证。我的CookieAuthenticationOptions 是:

app.UseCookieAuthentication(new CookieAuthenticationOptions()

    AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme,
    LoginPath = new PathString("/login"),
    AccessDeniedPath = new PathString("/unauthorized/"),
    AutomaticAuthenticate = true,
    AutomaticChallenge = true
);

cookie 创建得很好,在我运行应用程序的整个过程中,我都可以在浏览器设置中看到它。这是我的HomeController 班级:

public HomeController(IHostingEnvironment env,
    IAntiforgery antiforgery,
    IOptions<AppSettings> appSettings,
    TerminalDbContext terminalContext,
    ILoggerFactory loggerFactory,
    IHttpContextAccessor _httpContextAccessor)

    _env = env;
    _antiforgery = antiforgery;
    _appSettings = appSettings;
    _terminalContext = terminalContext;
    _logger = loggerFactory.CreateLogger<HomeController>();
    _httpContext = _httpContextAccessor.HttpContext;


    _logger.LogInformation("Cookie coming");
    var cookies = _httpContext.Request.Cookies[".AspNetCore.Cookies"];
    if (cookies != null)
    
        _logger.LogInformation(cookies.Length.ToString());
        _logger.LogInformation(cookies.ToString());
    
    else
    
    _logger.LogInformation("THE COOKIE IS NULL");
    

这就是我登录用户的方式:

var claims = new List<Claim>
    
        new Claim(ClaimTypes.Name, loginInfo.Username),
        new Claim("DbName", loginInfo.Terminal.SesamDbName),
    ;

var userIdentity = new ClaimsIdentity(claims, "password");

ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
await _httpContext.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);

我正在运行应用程序并创建了多个HomeController 实例,因为我有HttpGet 方法返回视图所需的JsonResult

应用程序第一次尝试[Authorize](对于Index() 方法),它会找到cookie 并进行身份验证和授权。第二次尝试[Authorize](对于返回JsonResultHttpGet 方法)它没有找到cookie,即使它在我的浏览器设置中。这是我得到的日志,以说明这一点:

...
info: Server.Controllers.HomeController[0]
      Cookie coming
info: Server.Controllers.HomeController[0]
      347
info: Server.Controllers.HomeController[0]
  CfDJ8GSLZENXaNpNrtmz2DAt9joqJ6CEHpCFbJdbNxbQYjjoQmd4naOI0L0krNMSQdVhqPRP9tJJMMIRayc5ILRQMcJQWNZ0T9Fjuk7Qxg65wPP7SR43UZxwy6vGQ7_qeSp44gYLLe4NGEalhXynZxmD-jywqL4VJZ5y4OwpsEKLx-VVT03xAlt54J_qQk_O4wjwLQiZBpAVTFKUWN4u7H8yd_rwMTIGBPu21t5n35To9bTQU5677xNxiEFap3ukuxO4p-OxVakXqShy2Xk_vYDAvv_XFV6jgNcy4ZiCRB8VUhXGcNr205h4X0-O7JHB8mYbc13aZLmrAwvG5DWTBd3_OCo
...
info: Server.Controllers.HomeController[0]
      Cookie coming
info: Server.Controllers.HomeController[0]
      THE COOKIE IS NULL

为什么会这样?我该怎么办?

【问题讨论】:

您确定在 both 情况下通过 HTTPS 发出请求吗? 如何检查? 我已经找出问题所在,感谢您的帮助,我会尽快发布答案。 出了什么问题?我注意到我是否使用 cookie 或基本身份验证 HTTP 上下文上的 User 属性在大约 60 秒不活动后不会水合。 @ScottWilson 我在下面发布了一个答案。 【参考方案1】:

问题与后端无关。我在前端使用 React,问题是 fetch() 没有将 cookie 传递到 GETmethods 的后端。我只需将 credentials: 'same-origin' 设置为fetch() 即可随请求一起发送cookie。感谢大家的帮助。

【讨论】:

以上是关于ASP.NET Core 身份验证 cookie 只收到一次的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 身份验证 cookie 只收到一次

如何手动解密 ASP.NET Core 身份验证 cookie?

ASP.NET Core 使用Cookie验证身份

如何使 ASP.NET Core 中的身份验证 cookie 无效?

如何使用 Postman 使用 cookie 身份验证测试 ASP.NET Core Web API?

Cookie 身份验证在 ASP.NET Core 应用程序中不起作用