0

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

我的 Startup.Auth 类没有什么特别之处:

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 类正在启动并从 Redis 获取身份验证 cookie。我只是不明白为什么这个 Cookie 仍然存在,如果它是设计的?

4

1 回答 1

1

按照下面的评论进行编辑

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

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

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

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

相同的概念也适用于会话:您可以决定使用外部存储,而不是将数据存储在 cookie 中,以便在浏览器和服务器之间传输的数据量最小(仅会话密钥)。


原始答案

仍然需要 cookie 来识别用户。

不同之处在于 cookie 现在不再包含会话数据,而只包含允许访问会话数据的 Redis 键。

于 2018-08-17T23:02:10.220 回答