示例#1
0
 public AccountController(
     UserManager <ApplicationUser> userManager,
     SignInManager <ApplicationUser> signInManager,
     TokenDescriptor tokenDescriptor,
     INotificationHandler notifications,
     IUser user,
     IEmailSender emailSender,
     IHostEnvironment hostingEnviroment,
     IConfiguration config,
     IMapper mapper,
     HttpClient httpClient,
     IOptions <ExternalAuthFacebookOptions> optionsAccessor,
     IRefreshTokenRepository <RefreshTokenData> refreshTokenRepository) : base(notifications, user)
 {
     _userManager            = userManager;
     _signInManager          = signInManager;
     _tokenDescriptor        = tokenDescriptor;
     _notifications          = notifications;
     _emailSender            = emailSender;
     _hostingEnviroment      = hostingEnviroment;
     _config                 = config;
     _mapper                 = mapper;
     _httpClient             = httpClient;
     Options                 = optionsAccessor.Value;
     _refreshTokenRepository = refreshTokenRepository;
 }
示例#2
0
        public UsuarioController(
            IUnitOfWork uow,
            IUser user,
            UsuarioHandler usuarioHandler,
            IUsuarioRepository usuarioRepository,
            IClaimValueRepository claimValueRepository,
            UserManager <Usuario> userManager,
            SignInManager <Usuario> signInManager,
            ILoggerFactory loggerFactory,
            TokenDescriptor tokenDescriptor

            ) : base(uow, user)
        {
            _usuarioHandler = usuarioHandler;

            _usuarioRepository = usuarioRepository;

            _claimValueRepository = claimValueRepository;

            _userManager = userManager;

            _signInManager = signInManager;

            _logger = loggerFactory.CreateLogger <UsuarioController>();

            _tokenDescriptor = tokenDescriptor;
        }
示例#3
0
 public JwtTokenGenerate(
     TokenDescriptor tokenDescriptor,
     IDistributedCache cache)
 {
     _tokenDescriptor = tokenDescriptor;
     _cache           = cache;
 }
示例#4
0
        private TdsToken CreateEnvChange(TokenDescriptor tokenDesc, TdsResponseStream stream, Encoding encoder, FormatToken lastFormat)
        {
            int len  = stream.ReadShort();
            int read = 0;

            var changes = new List <EnvChangeToken.Change>();

            while (read < len)
            {
                var change = new EnvChangeToken.Change();
                change.Type = (EnvChangeToken.EnvType)stream.Read();
                int newValLen = stream.Read();
                change.NewValue = stream.ReadString(newValLen);
                int oldValLen = stream.Read();
                change.OldValue = stream.ReadString(oldValLen);
                read           += 3 + newValLen + oldValLen;

                changes.Add(change);
            }

            return(new EnvChangeToken(tokenDesc.TokenType)
            {
                Changes = changes
            });
        }
        public async Task <bool> AddOrUpdateAsync(string issuer, string audience, TokenDescriptor value, CancellationToken cancellationToken = default)
        {
            try
            {
                var dbModel = _mapper.Map <TokenDbModel>(value);
                UpdateDefaultProperties(dbModel);
                dbModel.Audience = audience;
                dbModel.Issuer   = issuer;

                var commandDefinition = new CommandDefinition(_tokenTableUpdateScript,
                                                              parameters: new
                {
                    issuerKey       = dbModel.Issuer,
                    audienceKey     = dbModel.Audience,
                    issuer          = dbModel.Issuer,
                    audience        = dbModel.Audience,
                    private_key     = dbModel.PrivateKey,
                    ttl             = dbModel.Ttl,
                    expiration_time = dbModel.ExpirationDate,
                    is_active       = dbModel.IsActive,
                    payload         = dbModel.PayLoad,
                    creator         = dbModel.Creator,
                    created_time    = dbModel.CreatedTime,
                    updated_time    = DateTimeOffset.UtcNow,
                    updater         = dbModel.Updater,
                },
                                                              cancellationToken: cancellationToken);

                return(await _dataSource.Connection.ExecuteAsync(commandDefinition) > 0);
            }
            catch (Exception ex)
            {
                throw new RepositoryException(I18n.AddOrUpdateOperationException, ex);
            }
        }
示例#6
0
 public SecurityController(UserManager <ApplicationUser> userManager, SignInManager <ApplicationUser> signInManager, TokenDescriptor tokenDescriptor, IUser user, IMediatorBus mediator, INotificationHandler <DomainNotification> notifications, ILoggerFactory loggerFactory, IUnitOfWork unitOfWork) : base(mediator, notifications, loggerFactory, user)
 {
     _userManager     = userManager;
     _signInManager   = signInManager;
     _logger          = loggerFactory.CreateLogger <SecurityController>();
     _tokenDescriptor = tokenDescriptor;
 }
示例#7
0
        private TdsToken CreateReturnStatus(TokenDescriptor tokenDesc, TdsResponseStream stream, Encoding encoder, FormatToken lastFormat)
        {
            int value = stream.ReadInt();

            return(new ReturnStatusToken(tokenDesc.TokenType)
            {
                Value = value,
            });
        }
示例#8
0
 public AccountController(INotificationHandler <DomainNotification> notifications,
                          IMediatorHandler mediator,
                          TokenDescriptor tokenDescriptor,
                          IUsuarioRepository usuarioRepository) : base(notifications, mediator)
 {
     _usuarioRepository = usuarioRepository;
     _mediatorHandler   = mediator;
     _tokenDescriptor   = tokenDescriptor;
 }
示例#9
0
        internal static bool IsNot(this Token token, TokenDescriptor descriptor)
        {
            if (descriptor == null)
            {
                throw new ArgumentNullException(nameof(descriptor));
            }

            return(token.Descriptor != descriptor);
        }
        public static void AddMvcSecurity(this IServiceCollection services, IConfigurationRoot configuration)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            var tokenConfigurations = new TokenDescriptor();

            new ConfigureFromConfigurationOptions <TokenDescriptor>(
                configuration.GetSection("JwtTokenOptions"))
            .Configure(tokenConfigurations);
            services.AddSingleton(tokenConfigurations);

            services.AddIdentity <ApplicationUser, IdentityRole>(
                opts =>
            {
                opts.Password.RequireDigit           = true;
                opts.Password.RequireLowercase       = true;
                opts.Password.RequireUppercase       = true;
                opts.Password.RequireNonAlphanumeric = false;
                opts.Password.RequiredLength         = 8;
            }
                )
            .AddEntityFrameworkStores <SecurityContext>()
            .AddDefaultTokenProviders();

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(bearerOptions =>
            {
                bearerOptions.RequireHttpsMetadata = false;
                bearerOptions.SaveToken            = true;

                var paramsValidation = bearerOptions.TokenValidationParameters;

                paramsValidation.IssuerSigningKey = SigningCredentialsConfiguration.Key;
                paramsValidation.ValidAudience    = tokenConfigurations.Audience;
                paramsValidation.ValidIssuer      = tokenConfigurations.Issuer;

                paramsValidation.ValidateIssuerSigningKey = true;
                paramsValidation.ValidateLifetime         = true;
                paramsValidation.ClockSkew = TimeSpan.Zero;
            });

            services.AddAuthorization(options =>
            {
                options.AddPolicy("RequireAdminRole", policy => policy.RequireRole(Roles.ADMIN));

                options.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                                  .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                                  .RequireAuthenticatedUser().Build());
            });
        }
 public UsuariosController(UserManager <ApplicationUser> userManager, SignInManager <ApplicationUser> signInManager, ILoggerFactory loggerFactory, TokenDescriptor tokenDescriptor, INotificationHandler <DomainNotification> notifications, IUser user, IUsuarioRepository usuarioRepository, IMediatorHandler mediator, IMapper mapper) : base(notifications, user, mediator)
 {
     _userManager       = userManager;
     _signInManager     = signInManager;
     _usuarioRepository = usuarioRepository;
     _mediator          = mediator;
     _logger            = loggerFactory.CreateLogger <UsuariosController>();
     _tokenDescriptor   = tokenDescriptor;
     _mapper            = mapper;
 }
示例#12
0
 public AccountController(UserManager <ApplicationUser> userManager, SignInManager <ApplicationUser> signInManager, TokenDescriptor tokenDescriptor, IUser user, IMediatorHandler mediator, IAdopterRepository adopterRepository, INotificationHandler <DomainNotification> notifications, ILoggerFactory loggerFactory, IUnitOfWork unitOfWork) : base(mediator, notifications, loggerFactory, user)
 {
     _unitOfWork        = unitOfWork;
     _userManager       = userManager;
     _signInManager     = signInManager;
     _mediator          = mediator;
     _logger            = loggerFactory.CreateLogger <AccountController>();
     _tokenDescriptor   = tokenDescriptor;
     _adopterRepository = adopterRepository;
 }
示例#13
0
 public AccountController(
     UserManager <ApplicationUser> userManager,
     SignInManager <ApplicationUser> signInManager,
     ILoggerFactory loggerFactory,
     TokenDescriptor tokenDescriptor)
 {
     _userManager     = userManager;
     _signInManager   = signInManager;
     _logger          = loggerFactory.CreateLogger <AccountController>();
     _tokenDescriptor = tokenDescriptor;
 }
示例#14
0
 public UserAdapter(IOptions <UserApi> userApiOption,
                    UserManager <IdentityUser> userManager,
                    IOptions <TokenDescriptor> tokenDescriptorOption,
                    ILogger <UserAdapter> logger)
 {
     Errors           = new List <string>();
     _userApi         = userApiOption.Value;
     _userManager     = userManager;
     _tokenDescriptor = tokenDescriptorOption.Value;
     _logger          = logger;
 }
示例#15
0
 public UserService(
     UserManager <ApplicationUser> userManager,
     RoleManager <IdentityRole> roleManager,
     SignInManager <ApplicationUser> signInManager,
     TokenDescriptor tokenDescriptor)
 {
     _userManager     = userManager;
     _roleManager     = roleManager;
     _signInManager   = signInManager;
     _tokenDescriptor = tokenDescriptor;
 }
示例#16
0
 public AccountController(UserManager <ApplicationUser> userManager,
                          SignInManager <ApplicationUser> signInManager,
                          IEmailSender emailSender,
                          TokenDescriptor tokenDescriptor,
                          IUser user,
                          IAppNotificationHandler <DomainNotification> notification) : base(user, notification)
 {
     _userManager     = userManager;
     _signInManager   = signInManager;
     _emailSender     = emailSender;
     _tokenDescriptor = tokenDescriptor;
 }
示例#17
0
 public ContaController(
     UserManager <ApplicationUser> userManager,
     SignInManager <ApplicationUser> signInManager,
     RoleManager <IdentityRole> roleManager,
     TokenDescriptor tokenDescriptor,
     IUser user) : base(user)
 {
     _userManager     = userManager;
     _signInManager   = signInManager;
     _roleManager     = roleManager;
     _tokenDescriptor = tokenDescriptor;
 }
 public AutenticacaoController(
     IHandler <DomainNotification> domainNotificationHandler,
     TokenDescriptor tokenDescriptor,
     IUsuarioService usuarioService,
     IMapper mapper
     )
     : base(domainNotificationHandler)
 {
     _usuarioService  = usuarioService;
     _tokenDescriptor = tokenDescriptor;
     _mapper          = mapper;
 }
        public async Task AddOrUpdateTokenAsync(TokenDescriptor tokenDescriptor, CancellationToken cancellationToken = default)
        {
            if (string.IsNullOrWhiteSpace(tokenDescriptor.PrivateKey))
            {
                tokenDescriptor.PrivateKey = _passwordProvider.GetNextStringPassword(ValidationConstants.MaxPasswordLength);
            }

            _tokenDescriptorModelValidator.EnsureValidation(tokenDescriptor);

            await _tokenRepository.AddOrUpdateAsync(tokenDescriptor.Issuer, tokenDescriptor.Audience, tokenDescriptor, cancellationToken);

            _notifier.Notify(new TokenUpdatedNotifyMessage(tokenDescriptor.Issuer, tokenDescriptor.Audience, tokenDescriptor.Ttl, tokenDescriptor.ExpirationDate, tokenDescriptor.IsActive));
        }
示例#20
0
        internal static void ExpectedToBe(this Token token, TokenDescriptor descriptor)
        {
            if (descriptor == null)
            {
                throw new ArgumentNullException(nameof(descriptor));
            }

            if (!token.Is(descriptor))
            {
                throw new CaliParseException($"Unexpected input '{token.Value}' but was expecting '{descriptor.ReportableName}'",
                                             token.Line, token.Column);
            }
        }
示例#21
0
 public ChallengeController(ILoggerFactory loggerFactory,
                            UserManager <ApplicationUser> userManager,
                            SignInManager <ApplicationUser> signInManager,
                            IPersonagemService personagemService,
                            IEspecieService especieService,
                            TokenDescriptor tokenDescriptor)
 {
     _userManager       = userManager;
     _signInManager     = signInManager;
     _logger            = loggerFactory.CreateLogger <AccountController>();
     _personagemService = personagemService;
     _especieService    = especieService;
     _tokenDescriptor   = tokenDescriptor;
 }
示例#22
0
        public async Task <bool> AddOrUpdateAsync(string issuer, string audience, TokenDescriptor value,
                                                  CancellationToken cancellationToken = default)
        {
            using (var dbContext = _dbContextFactory.CreateDbContext())
            {
                try
                {
                    var dbModel = _mapper.Map <TokenDbModel>(value);
                    dbModel.Issuer   = issuer;
                    dbModel.Audience = audience;

                    UpdateDefaultProperties(dbModel, dbContext);

                    await using (var sqlCommand = new NpgsqlCommand(_tokenTableUpdateScript))
                    {
                        await using var connection = (NpgsqlConnection)dbContext.Database.GetDbConnection();
                        await connection.OpenAsync(cancellationToken);

                        sqlCommand.Connection = connection;

                        sqlCommand.Parameters.AddWithValue("@issuer", NpgsqlDbType.Varchar, dbModel.Issuer);
                        sqlCommand.Parameters.AddWithValue("@audience", NpgsqlDbType.Varchar, dbModel.Audience);
                        sqlCommand.Parameters.AddWithValue("@private_key", NpgsqlDbType.Varchar, dbModel.PrivateKey);
                        sqlCommand.Parameters.AddWithValue("@ttl", NpgsqlDbType.Integer, dbModel.Ttl);
                        sqlCommand.Parameters.AddWithValue("@expiration_time", NpgsqlDbType.TimestampTz, dbModel.ExpirationDate);
                        sqlCommand.Parameters.AddWithValue("@is_active", NpgsqlDbType.Boolean, dbModel.IsActive);

                        if (value.PayLoad != null)
                        {
                            sqlCommand.Parameters.AddWithValue("@payload", NpgsqlDbType.Jsonb, dbModel.PayLoad);
                        }
                        else
                        {
                            sqlCommand.Parameters.AddWithValue("@payload", NpgsqlDbType.Jsonb, DBNull.Value);
                        }

                        sqlCommand.Parameters.AddWithValue("@created_time", NpgsqlDbType.TimestampTz, dbModel.CreatedTime);
                        sqlCommand.Parameters.AddWithValue("@creator", NpgsqlDbType.Varchar, dbModel.Creator);
                        sqlCommand.Parameters.AddWithValue("@updated_time", NpgsqlDbType.TimestampTz, dbModel.UpdatedTime);
                        sqlCommand.Parameters.AddWithValue("@updater", NpgsqlDbType.Varchar, dbModel.Updater);

                        return(await sqlCommand.ExecuteNonQueryAsync(cancellationToken) > 0);
                    }
                }
                catch (Exception ex)
                {
                    throw new RepositoryException(I18n.AddOrUpdateOperationException, ex);
                }
            }
        }
        public static void AddMvcSecurity(this IServiceCollection services, IConfigurationRoot configuration)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            var tokenConfigurations = new TokenDescriptor();

            new ConfigureFromConfigurationOptions <TokenDescriptor>(configuration.GetSection("JwtOptions")).Configure(tokenConfigurations);
            services.AddSingleton(tokenConfigurations);
            services.AddIdentity <ApplicationUser, IdentityRole>().AddEntityFrameworkStores <ApplicationDbContext>().AddDefaultTokenProviders();
            services.AddCors();

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(bearerOptions =>
            {
                bearerOptions.RequireHttpsMetadata = false;
                bearerOptions.SaveToken            = true;

                var paramsValidation = bearerOptions.TokenValidationParameters;

                paramsValidation.IssuerSigningKey = SigningCredentialsConfiguration.Key;
                paramsValidation.ValidAudience    = tokenConfigurations.Audience;
                paramsValidation.ValidIssuer      = tokenConfigurations.Issuer;

                paramsValidation.ValidateIssuer           = true;
                paramsValidation.ValidateAudience         = true;
                paramsValidation.ValidateIssuerSigningKey = true;
                paramsValidation.ValidateLifetime         = true;
                paramsValidation.ClockSkew = TimeSpan.Zero;
            });

            services.AddAuthorization(options =>
            {
                options.AddPolicy("PodeVisualizar", policy => policy.RequireClaim("Contas", "Visualizar"));
                options.AddPolicy("PodeAlterar", policy => policy.RequireClaim("Contas", "Alterar"));
                options.AddPolicy("Bearer", new AuthorizationPolicyBuilder().AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme).RequireAuthenticatedUser().Build());
            });

            services.AddElmahIo(opt =>
            {
                opt.ApiKey = configuration.GetValue <string>("ElmahConfiguration:ApiKey");
                opt.LogId  = new Guid(configuration.GetValue <string>("ElmahConfiguration:LogId"));
            });
        }
示例#24
0
 public AccountController(INotificationHandler <DomainNotification> notifications,
                          IUser user,
                          IMediatorHandler mediator,
                          UserManager <ApplicationUser> userManager,
                          SignInManager <ApplicationUser> signInManager,
                          ILoggerFactory loggerFactory,
                          TokenDescriptor tokenDescriptor) : base(notifications, user, mediator)
 {
     _mediator        = mediator;
     _userManager     = userManager;
     _signInManager   = signInManager;
     _tokenDescriptor = tokenDescriptor;
     _logger          = loggerFactory.CreateLogger <AccountController>();
 }
示例#25
0
        public static void AddMvcSecurity(this IServiceCollection services, IConfigurationRoot configuration)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            var tokenConfigurations = new TokenDescriptor();

            new ConfigureFromConfigurationOptions <TokenDescriptor>(configuration.GetSection("JwtTokenOptions")).Configure(tokenConfigurations);

            services.AddSingleton(tokenConfigurations);

            services.AddIdentity <ApplicationUser, IdentityRole <Guid> >(o =>
            {
                o.Password.RequiredLength      = 8;
                o.User.RequireUniqueEmail      = true;
                o.SignIn.RequireConfirmedEmail = true;
            }).AddEntityFrameworkStores <ApplicationDbContext>().AddDefaultTokenProviders();

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(bearerOptions =>
            {
                bearerOptions.RequireHttpsMetadata = false;
                bearerOptions.SaveToken            = true;

                var paramsValidation = bearerOptions.TokenValidationParameters;

                paramsValidation.IssuerSigningKey = SigningCredentialsConfiguration.Key;
                paramsValidation.ValidAudience    = tokenConfigurations.Audience;
                paramsValidation.ValidIssuer      = tokenConfigurations.Issuer;

                paramsValidation.ValidateIssuerSigningKey = true;
                paramsValidation.ValidateLifetime         = true;
                paramsValidation.ClockSkew = TimeSpan.Zero;
            });

            services.AddAuthorization(options =>
            {
                //options.AddPolicy("PodeLerEventos", policy => policy.RequireClaim("Eventos", "Ler"));
                //options.AddPolicy("PodeGravar", policy => policy.RequireClaim("Eventos", "Gravar"));

                options.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                                  .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                                  .RequireAuthenticatedUser().Build());
            });
        }
示例#26
0
        private TdsToken CreateNotImplementedToken(TokenDescriptor tokenDesc, TdsResponseStream stream)
        {
            int len = 0;

            switch (tokenDesc.Len)
            {
            case TokenLength.OneByteLen:
                len = stream.Read();
                stream.SkipRead(len);
                len += 1;
                break;

            case TokenLength.TwoByteLen:
                len = stream.ReadShort();
                stream.SkipRead(len);
                len += 2;
                break;

            case TokenLength.FourByteLen:
                len = stream.ReadInt();
                stream.SkipRead(len);
                len += 4;
                break;

            case TokenLength.OneByte:
                len = 1;
                stream.SkipRead(len);
                break;

            case TokenLength.FourBytes:
                len = 4;
                stream.SkipRead(len);
                break;

            case TokenLength.EigthBytes:
                len = 8;
                stream.SkipRead(len);
                break;

            case TokenLength.Dependent:
            default:
                _logger?.LogError($"Unknown length of token of type {tokenDesc.TokenType}");
                throw new Exception($"Unknown length of token of type {tokenDesc.TokenType}");
            }

            _logger?.LogWarning($"Not implemented token {tokenDesc.TokenType} of len {len}");
            return(new UnknownToken(tokenDesc.TokenType, len));
        }
示例#27
0
 public AccountController(IDomainNotificationHandler <DomainNotification> notifications,
                          IUser user,
                          UserManager <IdentityUser> userManager,
                          SignInManager <IdentityUser> signanager,
                          ILoggerFactory logger,
                          IBus bus,
                          TokenDescriptor tokenDescriptor,
                          IOrganizadorRepository organizadorRepository) : base(notifications, user, bus)
 {
     _userManager           = userManager;
     _signanager            = signanager;
     _bus                   = bus;
     _logger                = logger.CreateLogger <AccountController>();
     _tokenDescriptor       = tokenDescriptor;
     _organizadorRepository = organizadorRepository;
 }
        public void EnsureValidation(TokenDescriptor tokenDescriptor)
        {
            EnsureAudienceValidation(tokenDescriptor.Audience);

            EnsureIssuerValidation(tokenDescriptor.Issuer);

            if (tokenDescriptor.PrivateKey.Length < ValidationConstants.MinPasswordLength ||
                tokenDescriptor.PrivateKey.Length > ValidationConstants.MaxPasswordLength)
            {
                throw new TokenManagementException(String.Format(I18n.IncorrectPrivateKeyLength, ValidationConstants.MinPasswordLength, ValidationConstants.MaxPasswordLength));
            }

            if (tokenDescriptor.Ttl < ValidationConstants.MinTtlValue || tokenDescriptor.Ttl > ValidationConstants.MaxTtlValue)
            {
                throw new TokenManagementException(String.Format(I18n.IncorrectTtlValue, ValidationConstants.MinTtlValue, ValidationConstants.MaxTtlValue));
            }
        }
        public async Task <bool> AddAsync(TokenDescriptor value, CancellationToken cancellationToken = default)
        {
            try
            {
                var dbModel = _mapper.Map <TokenDbModel>(value);
                UpdateDefaultProperties(dbModel);
                dbModel.CreatedTime = DateTimeOffset.UtcNow;
                dbModel.Creator     = _dataSource.InstanceId;

                var key = await _dataSource.Connection.InsertAsync(dbModel);

                return(key != null);
            }
            catch (Exception ex)
            {
                throw new RepositoryException(I18n.AddOperationException, ex);
            }
        }
示例#30
0
        private TdsToken CreateLoginAck(TokenDescriptor tokenDesc, TdsResponseStream stream, Encoding encoder, FormatToken lastFormat)
        {
            int len         = stream.ReadShort();
            int status      = stream.Read();
            var version     = stream.ReadBytes(4);
            int nameLen     = stream.Read();
            var name        = stream.ReadString(nameLen);
            var progVersion = stream.ReadBytes(4);

            return(new LoginAckToken(tokenDesc.TokenType)
            {
                Succeed = status == 5,
                Fail = status == 6,
                Negotiate = status == 7,
                TdsVersion = $"{version[0]}.{version[1]}.{version[2]}.{version[3]}",
                ServerProgram = name,
                ServerVersion = $"{progVersion[0]}.{progVersion[1]}.{progVersion[2]}.{progVersion[3]}",
            });
        }