/// <summary> /// Создает по указанным путям файлы содержащие RSA ключи. /// </summary> /// <param name="publicPath">Путь к публичному ключу.</param> /// <param name="privatePath">Путь к приватному ключу.</param> /// <param name="privatePassword">Пароль к приватному ключу.</param> public void CreateRsaKeyPair(string publicPath, string privatePath, string privatePassword) { _logger.InfoFormat("Начало создания файлов публичного \"{0}\" и приватного ключей", publicPath); var manager = new OpenSslManager(); manager.GenerateRSAKeys(LocationUtils.GetFullPath(), publicPath, privatePath, privatePassword); }
private void InternalUserRegistration(string login, string password, string notes) { try { RiseInfoStatusChanged("Регистрация пользователя"); var user = ClientCore.Instance.DataStore.GetUser(login); if (user != null) { if ((!string.IsNullOrWhiteSpace(user.PasswordHash)) && (!StringComparer.Ordinal.Equals(user.PasswordHash, BcryptHash(password)))) { RiseAuthError("Пароль не совпадает с текущим на клиенте"); return; } var userKey = ClientCore.Instance.DataStore.GetCurrentUserKey(user.UserIDGuid); if (userKey != null && userKey.IsActivatedBool) { _logger.InfoFormat("Пользователь с таким логином уже существует, отправка ключей невозможна {0}", login); RiseAuthError("Такой пользователь уже есть"); return; } } _logger.InfoFormat("Старт генерации ключей для пользователя {0}.", login); RiseInfoStatusChanged("Генерация ключей"); var privateFilePath = Path.Combine(LocationUtils.GetFullPath(), PrivateKeyFileName); var publicFilePath = Path.Combine(LocationUtils.GetFullPath(), PublicKeyFileName); ClientCore.Instance.CryptoService.CreateRsaKeyPair(publicFilePath, privateFilePath, password); if (!File.Exists(privateFilePath) || !File.Exists(publicFilePath)) { throw new Exception("Ключи не создались"); } //if var publicKeyData = File.ReadAllText(publicFilePath, _rsaKeyEncoding); var privateKeyData = File.ReadAllText(privateFilePath, _rsaKeyEncoding); RiseInfoStatusChanged("Отправка запроса на сервер"); var domainId = ClientCore.Instance.DataStore.GetFirstUserDomainID(); var request = new RegisterPublicKeyRequest(); request.ClientUserDomainID = domainId; request.EventDate = DateTime.Now; request.KeyNotes = notes; request.PublicKeyData = publicKeyData; request.UserLogin = login; var response = ClientCore.Instance.WebClient.RegisterPublicKey(request); if (user == null) { RiseInfoStatusChanged("Ответ получен, сохраняем локально пользователя"); user = new User(); user.DomainIDGuid = response.UserDomainID; user.LoginName = login; user.FirstName = string.Empty; user.Email = string.Empty; user.LastName = string.Empty; user.Email = string.Empty; user.ProjectRoleID = ProjectRoleSet.GetMinimumRoleID(); user.Phone = string.Empty; user.PasswordHash = BcryptHash(password); ClientCore.Instance.DataStore.SaveUser(user); } else { if (string.IsNullOrWhiteSpace(user.PasswordHash))//при первой регистрации пользователя { user.PasswordHash = BcryptHash(password); ClientCore.Instance.DataStore.SaveUser(user); } } RiseInfoStatusChanged("Сохраняем пользовательский ключ"); var key = new UserKey(); key.EventDateDateTime = request.EventDate; key.UserIDGuid = user.UserIDGuid; key.Number = response.Number; key.PrivateKeyData = privateKeyData; key.PublicKeyData = publicKeyData; key.IsActivatedBool = false; ClientCore.Instance.DataStore.SaveUserKey(key);//TODO удалить пользователя, если ключ не сохранился RiseInfoStatusChanged("Пользователь успешно зарегистрировался"); RiseUserRegistredEventArgs(login); } catch (Exception ex) { _logger.LogError(ex, string.Format("Во время регистрации ключей пользователя {0} произошла ошибка ", login)); RiseAuthError(ex.Message, ex); } //try }