Session 是否是asp.net Core Cookie身份验证而无身份会话无状态是或否?

Session 是否是asp.net Core Cookie身份验证而无身份会话无状态是或否?,session,authentication,cookies,asp.net-core,.net-core,Session,Authentication,Cookies,Asp.net Core,.net Core,我一直在看很多教程,他们总是说asp.net Corecookie身份验证用户在会话对象中使用会话Id在服务器端保持身份验证。但是在CookieAuthenticationHandler.csSignInAsync中,只有当Options.SessionStore存在时才保存会话Id,如果不是这种情况,我假设在每个请求中发送所有加密的声明,而不需要将所有数据存储到会话对象(如令牌身份验证)。那么,有人能给我澄清一下吗 CookieAuthenticationHandler.cs源代码 va

我一直在看很多教程,他们总是说asp.net Core
cookie身份验证
用户在会话对象中使用会话Id在服务器端保持身份验证。但是在CookieAuthenticationHandler.cs
SignInAsync
中,只有当
Options.SessionStore
存在时才保存会话Id,如果不是这种情况,我假设在每个请求中发送所有加密的声明,而不需要将所有数据存储到
会话对象
(如令牌身份验证)。那么,有人能给我澄清一下吗

CookieAuthenticationHandler.cs源代码

   var ticket = new AuthenticationTicket(signInContext.Principal, signInContext.Properties, signInContext.Scheme.Name);



              if (Options.SessionStore != null)

              {

                  if (_sessionKey != null)

                    {

                        await Options.SessionStore.RemoveAsync(_sessionKey);

                    }

                    _sessionKey = await Options.SessionStore.StoreAsync(ticket);

                    var principal = new ClaimsPrincipal(

                        new ClaimsIdentity(

                            new[] { new Claim(SessionIdClaim, _sessionKey, ClaimValueTypes.String, Options.ClaimsIssuer) },

                            Options.ClaimsIssuer));

                    ticket = new AuthenticationTicket(principal, null, Scheme.Name);

                }



                var cookieValue = Options.TicketDataFormat.Protect(ticket, GetTlsTokenBinding());

CookieAuthentication可以在不启用会话的情况下正常工作

所有声明都被序列化到cookie中,并由认证中间件在每个请求上反序列化为ClaimsPrinicpal

因此,如果您的意思是无状态,如无需会话状态,那么是的,状态在cookie中,随每个请求一起传递。

要证明这一点,请创建一个新的应用程序。注册一个新用户。删除数据库并重新创建它。当您返回应用程序时,您将被视为仍然经过身份验证

如果有什么区别的话,cookie只是用作会话之外的缓存。和任何缓存一样,您必须检查它是否过时,这意味着在客户端和服务器之间同步状态

正如菲尔·卡尔顿所说,在计算机科学中只有两件困难的事情:缓存失效和命名


实现无国籍状态应该被视为一个目标,而不是一项宗教使命。

默认情况下,如果没有安装会话,它是无国籍的

一个简单的测试来证明这一点:

  • 通过CookieAuthentication/SignIn将cookie返回给您的客户端
  • 将cookie值保存到某个地方
  • 然后注销(服务器返回一个SetCookie以重置身份验证cookie的值)
  • 从客户端发送请求,重用在1中获得的值
  • 尽管处于注销阶段,您仍将通过身份验证!如果默认情况下您有一个服务器端会话机制,那么此cookie将变得无效,因为会话将被破坏,服务器将无法将cookie与会话匹配

我认为SessionStore并不意味着asp.net会话。根据文档,它是“用于跨请求存储票据的可选容器”