internal BearerToken CreateAccessToken(ClaimsPrincipal claimsPrincipal, TimeSpan validTime)
        {
            byte[] encryptedToken;
            using (var stream = GlobalVars.RecyclableMemory.GetStream("claims-principal", 32))
            {
                using (var bwriter = new BinaryWriter(stream, Encoding.UTF8, true))
                {
                    claimsPrincipal.WriteTo(bwriter);
                }
                byte[] serializedClaims = stream.ToArray();

                DateTime validity     = DateTime.Now + validTime;
                var      serverBearer = new ServerAccessToken(serializedClaims, validity);

                using (var mem = GlobalVars.RecyclableMemory.GetStream())
                {
                    ProtoBuf.Serializer.Serialize(mem, serverBearer);
                    byte[] serializedTmpBuf = mem.GetBuffer();

                    // Закриптовать.
                    encryptedToken = Jwt.EncryptToBytes(serializedTmpBuf.AsSpan(0, (int)mem.Length));
                }
                var token = new BearerToken(encryptedToken, validity);
                return(token);
            }
        }
        private IActionResult SignIn(ServerAccessToken bearerToken)
        {
            Debug.Assert(bearerToken.ClaimsPrincipal != null);

            ClaimsPrincipal user;

            if (DateTime.Now < bearerToken.Validity)
            // Токен валиден.
            {
                using (var mem = new MemoryStream(bearerToken.ClaimsPrincipal, 0, bearerToken.ClaimsPrincipal.Length, writable: false, publiclyVisible: true))
                    using (var breader = new BinaryReader(mem, Encoding.UTF8, leaveOpen: true))
                    {
                        try
                        {
                            user = new ClaimsPrincipal(breader);
                        }
                        catch (EndOfStreamException)
                        {
                            return(new BadRequestResult("Аутентификация не работает на .NET Framework из-за бага"));
                        }
                        catch (Exception)
                        {
                            return(new BadRequestResult("Токен не валиден"));
                        }
                    }
            }
            else
            {
                return(new BadRequestResult("Токен истёк"));
            }

            // Эта строка фактически атомарно аутентифицирует соединение для всех последующих запросов.
            _user = user;

            Listener.OnConnectionAuthenticated(this, user);
            return(new OkResult());
        }