Session 是否是asp.net Core Cookie身份验证而无身份会话无状态是或否?
我一直在看很多教程,他们总是说asp.net CoreSession 是否是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
cookie身份验证
用户在会话对象中使用会话Id在服务器端保持身份验证。但是在CookieAuthenticationHandler.csSignInAsync
中,只有当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与会话匹配