【问题标题】:How does ASP.NET Core know that cookie is valid in cookie authentication?ASP.NET Core 如何知道 cookie 在 cookie 身份验证中是否有效?
【发布时间】:2018-02-02 23:03:27
【问题描述】:

我正在尝试了解 cookie 身份验证,尤其是对于 ASP.NET Core。据我了解,cookie 身份验证的一般工作方式是会话 ID 存储在服务器端和客户端。发出请求时,会发送会话 ID,并与服务器端的 ID 进行检查。

我在 ASP.NET Core 中使用以下代码尝试了 cookie 身份验证中间件:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
   AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme,
   AutomaticAuthenticate = true
});

在 AccountController 中,登录后:

var myUser = GetUser(email, password);
var claims = new List<Claim>
{
   new Claim(ClaimTypes.Name, myUser.Name)
};
var props = new AuthenticationProperties
{
   IsPersistent = persistCookie,
   ExpiresUtc = DateTime.UtcNow.AddYears(1)
};

var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), props);

我看到浏览器中有一个 cookie,但它存储在服务器端的什么位置?我想我需要将它存储在数据库中以检查是否有效,但它似乎已经存储在某个地方,因为我还没有完成任何数据库代码。还有,ASP.NET Core 怎么知道传递过来的 cookie 是有效的?

【问题讨论】:

  • Cookies 根本不存储在服务器上。服务器只是解码浏览器发送的内容。
  • @Bart Calixto:服务器如何知道 cookie 有效?
  • 不要试图在技术上 100% 正确:cookie 是使用非公开的“机器密钥”加密的,只有您的服务器知道,当客户端发送 cookie 时,服务器会尝试使用它的机器密钥进行解码.如果无法解码,它将被丢弃(也称为无效)。
  • 好吧,忘了这是aspnet-core。对于 aspnet-core 而不是机器密钥,有一个我不熟悉的 DataProtection api 负责。 github.com/aspnet/DataProtection

标签: authentication asp.net-core session-cookies


【解决方案1】:

在此设置中,服务器上没有存储任何内容。 cookie 包含完整的序列化、加密的 ClaimsPrincipal 和 AuthenticationProperties。

如果标识太大,可以使用与您描述的类似的参考模式。在这种情况下,是的,您确实需要设置数据存储。没有提供默认实现。 https://github.com/aspnet/Security/blob/5b29bced0d2f1cfc78843bcd9ec9a828c6fb5fef/src/Microsoft.AspNetCore.Authentication.Cookies/CookieAuthenticationOptions.cs#L138

【讨论】:

  • 谢谢,那么服务器如何知道 cookie 是有效的呢?我可能遗漏了一些东西,抱歉,我不清楚。
  • cookie auth 中间件使用它的私钥对其进行解密,检查过期等。
  • 这是否意味着黑客可以通过某种方式创建一个 fake cookie 并对其进行加密?然后它可以模拟任何用户访问后端 API。当整个东西都是开源的时,我看不到如何保护秘密私钥......
  • 私钥是在你部署启动应用时随机生成的。黑客必须破解服务器本身才能获得密钥。在这一点上,模仿是你最不担心的。
猜你喜欢
  • 2017-03-30
  • 2020-05-07
  • 2018-09-02
  • 1970-01-01
  • 2021-06-19
  • 2017-02-15
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
相关资源
最近更新 更多