使用 Owin SessionStore 进行 cookie 存储仍然会向浏览器发送 cookie

Using Owin SessionStore for cookie storage still sends cookie to browser

我已经使用 Redis 实现了 cookie 存储。我大部分时间都遵循 this 代码示例...

我的Startup.Auth没什么特别的class:

public void ConfigureAuth(IAppBuilder app)
{
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

    IDataProtector dataProtector = app.CreateDataProtector(typeof(RedisAuthenticationTicket).FullName);

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,

        LoginPath = new PathString("/Login.aspx"),
        LogoutPath = new PathString("/Register.aspx"),
        SessionStore = new RedisSessionStore(new TicketDataFormat(dataProtector)),

        Provider = new CookieAuthenticationProvider
        { 
            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                validateInterval: TimeSpan.FromSeconds(300),
                regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)),

        }
    });
...

我的印象是实施 SessionStore 意味着我在浏览器中看到的唯一会话 cookie 是 ASPNET_SessionId,但我的应用程序似乎仍然在登录后创建一个 AspNetCookie...这绝对是来自 Owin 初创公司 - 我可以在我的初创公司中更改它的名称。

我的 AuthenticationSessionStore class 正在启动并从 Redis 获取身份验证 cookie。我只是想不通为什么这个 Cookie 仍然存在,是否是设计使然?

根据下面的评论进行编辑

.AspNet.Cookies 是允许服务器知道用户何时登录到您的应用程序的身份验证 cookie。

您使用 Redis 并不意味着不再需要 cookie。 如果用户 A 和 B 不发送 cookie,您如何区分他们?

如果您没有使用 Redis,身份验证 cookie 值将包含用户信息。 使用 Redis 时,用户信息存储在那里,身份验证 cookie 值包含允许访问此信息的 Redis 密钥。

会话 cookie 与身份验证 cookie 的不同之处在于,用户无需登录即可为您存储会话数据。这可能对电子商务应用程序很有用,您可以在其中向未登录和已登录的用户显示他们查看了哪些产品。

同样的概念也适用于会话:您可以决定使用外部存储而不是将数据存储在 cookie 中,这样浏览器和服务器之间传输的数据量最少(只有会话键)。


原回答

仍然需要 cookie 来识别用户。

不同的是cookie现在不再包含session数据,而只包含允许访问session数据的Redis key。