【问题标题】:Where does ASP.Net Core `cookies authentication` store a reference to that cookie?ASP.Net Core `cookies authentication` 在哪里存储对该 cookie 的引用?
【发布时间】:2018-04-25 11:30:40
【问题描述】:

有时我看到 PHP 开发人员在他们的 cookie 中传递一个 Id,并在数据库中保存对该 cookie 的引用(这样他们就可以通过 cookie 对用户进行身份验证)。但在 ASP.Net Core 中,我从未见过。

ASP.Net Core 如何以及在何处知道此 cookie 归该用户所有?是否所有内容都存储在内存中(在某种对象中)?

如果是,这是否意味着如果我重新启动我的应用程序,用户应该再次登录?或者 ASP.Net Core 是否提供了任何方法来保留对 cookie 的引用,即使在重新启动应用程序后也是如此?

【问题讨论】:

  • cookie 存储在浏览器中。如果会话没有过期,你应该可以重复使用它。
  • @Nikolaus,是的,但是当在下一个请求中将该 cookie 发送回服务器时,服务器如何知道该 cookie 有效?如果用户现在被停用怎么办?或更改密码。如果保存在客户端并且在服务器端没有指向它的引用,服务器如何撤销该 cookie?
  • Cookie 包含加密形式的用户信息,因此它不同于您描述的 cookie 类型(仅存储指向用户信息的指针)。
  • @Evk,在这种情况下,如何重新启动应用程序并进行验证?如果我重新启动应用程序(服务器端),它们会丢失吗?如果服务器上没有存储任何内容,我该如何撤销这些 cookie(例如,如果我想停用用户)?
  • 重新启动应用程序不应影响 cookie,因为内存中没有存储关于它们的任何内容。直到 cookie 过期 - 即使您禁用用户,它也将有效。您可以拦截 cookie 验证并进行更改 - 在此处阅读一种方法 - docs.microsoft.com/en-us/aspnet/core/security/authentication/…

标签: c# asp.net .net cookies asp.net-core


【解决方案1】:

服务器唯一需要存储的是解密密钥,它存储为Data Protection 密钥。根据the docs,密钥被持久化到这些位置:

如果应用托管在 Azure 应用中,则密钥会持久保存到 %HOME%\ASP.NET\DataProtection-Keys 文件夹。此文件夹由 网络存储,并在托管的所有计算机上同步 应用程序。

如果用户配置文件可用,则密钥将持久保存到 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 文件夹。如果操作 系统是 Windows,密钥使用 DPAPI 进行静态加密。

【讨论】:

    【解决方案2】:

    ClaimsPrincipal 被序列化、加密并作为 cookie 发送给客户端。一旦创建了 cookie,它就会成为唯一的身份来源。当客户端发出请求时,它发送 cookie,服务器将其解密(用作验证)并反序列化到 HttpContext 中。

    【讨论】:

    • 知道那个 cookie 叫什么名字吗?
    • 它是可配置的,但默认值为 .AspNetCore.Cookies docs.microsoft.com/en-us/dotnet/api/…
    • @hobwell 在 ASP.NET Core 2.1 中这个 cookie 被命名为 .AspNetCore.Identity.Application
    • 但是 cookie(或序列化的 ClaimsPrincipal)在哪里以及如何存储在服务器上?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2014-02-11
    相关资源
    最近更新 更多