Exemplo n.º 1
0
 internal int Step2SetContext(ServerChallenge sc, string username, byte[] password)
 {
     _username        = username;
     _serverChallenge = sc;
     _serverResponse  = null;
     return(Step2(password));
 }
Exemplo n.º 2
0
        public ActionResult BeginLogin(BeginLoginModel model)
        {
            if ((string.IsNullOrWhiteSpace(model.UserName) || string.IsNullOrWhiteSpace(model.Password)) ||
                (!_memeberShipService.IsUserRegistered(model.UserName.Trim()) &&
                 !_memeberShipService.IsValidUserNameAndPassword(model.UserName.Trim(), model.Password.Trim())))
            {
                // If we got this far, something failed, redisplay form
                ModelState.AddModelError("CustomError", "User has not been registered");
                return(View("Login", model));
            }

            try
            {
                ServerChallenge serverChallenge = _memeberShipService.GenerateServerChallenge(model.UserName.Trim());

                CompleteLoginModel loginModel = new CompleteLoginModel
                {
                    AppId     = serverChallenge.AppId,
                    KeyHandle = serverChallenge.KeyHandle,
                    Version   = serverChallenge.Version,
                    Challenge = serverChallenge.Challenge,
                    UserName  = model.UserName.Trim()
                };
                return(View("FinishLogin", loginModel));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

            ModelState.AddModelError("CustomError", "User has not been registered");
            return(View("Login", model));
        }
Exemplo n.º 3
0
        public ServerChallenge GenServerChallenge(string tag, string requestNumber, long?userId)
        {
            //随机数
            var random = RandomTool.CreatSafeRandomBase64(32);

            var challenge = new ServerChallenge()
            {
                Id            = this.idGenerator.NextId(),
                UserId        = userId,
                Tag           = tag,
                RequestNumber = requestNumber,
                Random        = random,
                UinxTime      = UnixTimeUtil.GetTimeStampInInt32()
            };

            SaveServerChallenge(challenge);
            return(challenge);
        }
Exemplo n.º 4
0
        public int Step1(string username, long[] trace)
        {
            var clientChallenge = new ClientChallenge();

            if (CheckVendor.NotValidUsername(username) || CheckVendor.NotValidTrace(trace))
            {
                return(03_0010);
            }

            clientChallenge.Trace = trace;

            _username = username;
            clientChallenge.Username = username;

            clientChallenge.ReportTime = DateTime.Now;

            for (var i = 0; i < 3; i++)
            {
                var result = ApiCall.AuthStart.Call(null, new MilvanethProtocol {
                    Context = null, Data = clientChallenge
                });

                if (!(result.Data is ServerChallenge sc))
                {
                    return(02_0007);
                }

                if (!CheckVendor.NotValidResponse(sc))
                {
                    _serverChallenge = sc;
                }

                if (sc.Message != 01_0003) // retry with pow
                {
                    return(sc.Message);
                }

                clientChallenge.SessionId = sc.SessionId;

                clientChallenge.ProofOfWork = ProofOfWorkVendor.CalculateProofOfWork(sc.ProofOfWork);
            }

            return(01_0002);
        }
Exemplo n.º 5
0
        public int Step1(LobbyServiceResult service, LobbyCharacterResult character, string username, string displayName, string email, byte[] password, long[] trace)
        {
            var registerForm = new RegisterForm();

            if (CheckVendor.NotValidService(service))
            {
                return(03_0000);
            }

            registerForm.Service = service;

            if (CheckVendor.NotValidCharacter(character))
            {
                return(03_0000);
            }

            registerForm.Character = character;

            if (CheckVendor.NotValidTrace(trace))
            {
                return(03_0008);
            }

            registerForm.Trace = trace;

            // 4-16个字符,可使用英文、数字和下划线,必须以字母开头
            if (CheckVendor.NotValidUsername(username))
            {
                return(03_0001);
            }

            registerForm.Username = username;

            // 2-12个字符,可使用中英文、数字和下划线
            if (CheckVendor.NotValidDisplayName(displayName))
            {
                return(03_0003);
            }

            registerForm.DisplayName = displayName;

            if (CheckVendor.NotValidEmail(email))
            {
                return(03_0005);
            }

            registerForm.Email = email;

            // 4个字符以上的中文或8个字符以上的数字和字母
            if (CheckVendor.NotValidPassword(password))
            {
                return(03_0007);
            }

            _username = username;
            _password = password;

            registerForm.Verifier = Srp6Vendor.Srp6Init(username, password, out var salt).ToByteArray();

            registerForm.Salt = salt;

            registerForm.GroupParam = Srp6Vendor.BitLength;

            registerForm.ReportTime = DateTime.Now;

            for (var i = 0; i < 3; i++)
            {
                var result = ApiCall.AccountCreate.Call(null, new MilvanethProtocol {
                    Context = null, Data = registerForm
                });

                if (!(result.Data is ServerChallenge sc))
                {
                    return(02_0007);
                }

                if (!CheckVendor.NotValidResponse(sc))
                {
                    _serverChallenge = sc;
                }

                if (sc.Message != 01_0003) // retry with pow
                {
                    return(sc.Message);
                }

                registerForm.SessionId = sc.SessionId;

                registerForm.ProofOfWork = ProofOfWorkVendor.CalculateProofOfWork(sc.ProofOfWork);
            }

            return(01_0002);
        }
Exemplo n.º 6
0
        /// <summary>
        /// 存储挑战
        /// </summary>
        /// <param name="challenge"></param>
        private void SaveServerChallenge(ServerChallenge challenge)
        {
            var json = JsonSerializer.Serialize(challenge);

            distributedCache.SetString("challenge" + challenge.Id.ToString(), json, 200);
        }