使用 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。
我已经使用 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。