【问题标题】:Is it asp.net Core Cookie Authentication without identity session stateless yes or no?是没有身份会话无状态的 asp.net Core Cookie 身份验证是或否?
【发布时间】:2018-11-22 22:35:46
【问题描述】:

我一直在看很多教程,他们总是说 asp.net Core cookie authentication 用户在具有会话 ID 的 Session 对象中保持服务器端的身份验证。但是在 CookieAuthenticationHandler.cs SignInAsync 仅在存在 Options.SessionStore 时保存 sessionId ,如果不是这种情况,我想在每个请求中发送所有加密声明而不需要将所有数据存储到 Session object (如令牌认证)。所以,请有人向我澄清一下。

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());

【问题讨论】:

  • 我不相信 SessionStore 意味着一个 asp.net 会话。根据文档,它是“跨请求存储票证的可选容器”

标签: session authentication cookies asp.net-core .net-core


【解决方案1】:

CookieAuthentication 可以在不启用 Session 的情况下正常工作。

身份验证中间件在每个请求上将所有声明序列化为 cookie 并反序列化为 ClaimsPrinicpal。

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

【讨论】:

    【解决方案2】:

    没有。

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

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

    而且,正如 Phil Karlton 所说,计算机科学中只有两件难事:缓存失效和命名。

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

    【讨论】:

      【解决方案3】:

      默认情况下,没有安装 Session,它是无状态的。

      一个简单的测试来证明它:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-19
        • 2010-09-26
        • 2017-03-30
        • 2014-07-09
        • 2015-10-09
        • 1970-01-01
        • 2015-06-24
        • 1970-01-01
        相关资源
        最近更新 更多