Как сохранить устройство в Cognito? ⇐ C#
-
Гость
Как сохранить устройство в Cognito?
Я новичок в AWS Cognito, и у меня возникла проблема с сохранением устройства для пользователя. В моем пуле пользователей в разделе «Вход в систему» есть:
[*]Многофакторная аутентификация: Принудительное соблюдение MFA: требуется MFA. [*]Методы MFA: приложения для проверки подлинности. [*]Отслеживание устройства: Запомнить пользовательские устройства: всегда помнить [*]Доверять запомненным устройствам для подавления MFA: да
Я регистрируюсь и вхожу в систему с помощью размещенного пользовательского интерфейса, но в сведениях о пользователе не отображается ни одно устройство. Я попробовал сделать это с помощью кода — создал консольное приложение .net, оно выглядит так:
внутренний класс Program { частная константная строка ClientId = «my_client_id»; статическая асинхронная задача Main(string[] args) { дождитесь LoginUser(); } статическая асинхронная задача LoginUser() { строка электронной почты = «myEmail»; строковый пароль = «мойПароль»; вар authRequest = новый InitiateAuthRequest { AuthFlow = AuthFlowType.USER_PASSWORD_AUTH, Идентификатор Клиента = Идентификатор Клиента, AuthParameters = новый словарь { { "ИМЯ ПОЛЬЗОВАТЕЛЯ", адрес электронной почты }, { "ПАРОЛЬ", пароль}, } }; вар authResponse = ждут cognitoClient.InitiateAuthAsync(authRequest); if (authResponse.ChallengeName == ChallengeNameType.SOFTWARE_TOKEN_MFA) { дождитесь SetupSoftwareTokenMFA (authResponse.Session, электронная почта, authResponse.ChallengeName); } } статическая асинхронная задача SetupSoftwareTokenMFA (строковый сеанс, строковое имя пользователя, строковое имя вызова) { строка mfaCode = "myMfaCode"; var submitMfaRequest = новый RespondToAuthChallengeRequest { Идентификатор Клиента = Идентификатор Клиента, ИмяВызова = ИмяВызова, Сеанс = сеанс, ChallengeResponses = новый словарь { { "ИМЯ ПОЛЬЗОВАТЕЛЯ", Имя пользователя }, { "SOFTWARE_TOKEN_MFA_CODE", mfaCode } } }; вар submitMfaResponse = ждут cognitoClient.RespondToAuthChallengeAsync(confirmMfaRequest); ждут SaveDeviceInformation (confirmMfaResponse.AuthenticationResult, userName); } статическая асинхронная задача SaveDeviceInformation (результат AuthenticationResultType, строка userName) { byte[]randomPasswordBytes = GenerateRandomBytes(40); строка randomPasswordBase64 = Convert.ToBase64String(randomPasswordBytes); вар deviceSecretVerifierConfig = GenerateDeviceVerifier (result.NewDeviceMetadata.DeviceGroupKey, randomPasswordBase64, userName); var submitDeviceRequest = новый ConfirmDeviceRequest { AccessToken = результат.AccessToken, DeviceKey = result.NewDeviceMetadata.DeviceKey, ИмяУстройства = result.NewDeviceMetadata.DeviceGroupKey, DeviceSecretVerifierConfig = DeviceSecretVerifierConfig }; var ответ = ждут cognitoClient.ConfirmDeviceAsync(confirmDeviceRequest); } //вспомогательные методы, в основном отсюда: https://github.com/aws/aws-sdk-net-exte ... nHelper.cs частный статический байт [] GenerateRandomBytes (целое число) { byte[]randomBytes = новый байт[длина]; используя (var rng = новый RNGCryptoServiceProvider()) { rng.GetBytes(randomBytes); } вернуть случайные байты; } общедоступный статический DeviceSecretVerifierConfigType GenerateDeviceVerifier (строка deviceGroupKey, строка devicePass, строка имени пользователя) { Случайный r = новый Random(); byte[] userIdContent = CognitoAuthHelper.CombineBytes( Кодировка.UTF8.GetBytes(deviceGroupKey), Кодировка.UTF8.GetBytes(имя пользователя), Кодировка.UTF8.GetBytes(":"), Кодировка.UTF8.GetBytes(devicePass) ); byte[] userIdHash = CognitoAuthHelper.Sha256.ComputeHash(userIdContent); байт[] saltBytes = новый байт[16]; RandomNumberGenerator.Create().GetBytes(saltBytes); // установка начального байта в 0-127, чтобы избежать отрицательной соли или ошибки проверки пароля saltBytes[0] = (байт)r.Next(sbyte.MaxValue); byte[] xBytes = CognitoAuthHelper.CombineBytes(saltBytes, userIdHash); byte[] xDigest = CognitoAuthHelper.Sha256.ComputeHash(xBytes); BigInteger x = BigIntegerExtensions.FromUnsignedBigEndian(xDigest); вар v = BigInteger.ModPow(g, x, N); byte[] vBytes = v.ToBigEndianByteArray(); вернуть новый DeviceSecretVerifierConfigType { PasswordVerifier = Convert.ToBase64String(vBytes), Соль = Convert.ToBase64String(saltBytes) }; } внутренний статический байт[] JointBytes(значения параметров byte[][]) { интервал комбинированной длины = 0; байт [] returnBytes; int copyIndex = 0; for (int i = 0; я
Я новичок в AWS Cognito, и у меня возникла проблема с сохранением устройства для пользователя. В моем пуле пользователей в разделе «Вход в систему» есть:
[*]Многофакторная аутентификация: Принудительное соблюдение MFA: требуется MFA. [*]Методы MFA: приложения для проверки подлинности. [*]Отслеживание устройства: Запомнить пользовательские устройства: всегда помнить [*]Доверять запомненным устройствам для подавления MFA: да
Я регистрируюсь и вхожу в систему с помощью размещенного пользовательского интерфейса, но в сведениях о пользователе не отображается ни одно устройство. Я попробовал сделать это с помощью кода — создал консольное приложение .net, оно выглядит так:
внутренний класс Program { частная константная строка ClientId = «my_client_id»; статическая асинхронная задача Main(string[] args) { дождитесь LoginUser(); } статическая асинхронная задача LoginUser() { строка электронной почты = «myEmail»; строковый пароль = «мойПароль»; вар authRequest = новый InitiateAuthRequest { AuthFlow = AuthFlowType.USER_PASSWORD_AUTH, Идентификатор Клиента = Идентификатор Клиента, AuthParameters = новый словарь { { "ИМЯ ПОЛЬЗОВАТЕЛЯ", адрес электронной почты }, { "ПАРОЛЬ", пароль}, } }; вар authResponse = ждут cognitoClient.InitiateAuthAsync(authRequest); if (authResponse.ChallengeName == ChallengeNameType.SOFTWARE_TOKEN_MFA) { дождитесь SetupSoftwareTokenMFA (authResponse.Session, электронная почта, authResponse.ChallengeName); } } статическая асинхронная задача SetupSoftwareTokenMFA (строковый сеанс, строковое имя пользователя, строковое имя вызова) { строка mfaCode = "myMfaCode"; var submitMfaRequest = новый RespondToAuthChallengeRequest { Идентификатор Клиента = Идентификатор Клиента, ИмяВызова = ИмяВызова, Сеанс = сеанс, ChallengeResponses = новый словарь { { "ИМЯ ПОЛЬЗОВАТЕЛЯ", Имя пользователя }, { "SOFTWARE_TOKEN_MFA_CODE", mfaCode } } }; вар submitMfaResponse = ждут cognitoClient.RespondToAuthChallengeAsync(confirmMfaRequest); ждут SaveDeviceInformation (confirmMfaResponse.AuthenticationResult, userName); } статическая асинхронная задача SaveDeviceInformation (результат AuthenticationResultType, строка userName) { byte[]randomPasswordBytes = GenerateRandomBytes(40); строка randomPasswordBase64 = Convert.ToBase64String(randomPasswordBytes); вар deviceSecretVerifierConfig = GenerateDeviceVerifier (result.NewDeviceMetadata.DeviceGroupKey, randomPasswordBase64, userName); var submitDeviceRequest = новый ConfirmDeviceRequest { AccessToken = результат.AccessToken, DeviceKey = result.NewDeviceMetadata.DeviceKey, ИмяУстройства = result.NewDeviceMetadata.DeviceGroupKey, DeviceSecretVerifierConfig = DeviceSecretVerifierConfig }; var ответ = ждут cognitoClient.ConfirmDeviceAsync(confirmDeviceRequest); } //вспомогательные методы, в основном отсюда: https://github.com/aws/aws-sdk-net-exte ... nHelper.cs частный статический байт [] GenerateRandomBytes (целое число) { byte[]randomBytes = новый байт[длина]; используя (var rng = новый RNGCryptoServiceProvider()) { rng.GetBytes(randomBytes); } вернуть случайные байты; } общедоступный статический DeviceSecretVerifierConfigType GenerateDeviceVerifier (строка deviceGroupKey, строка devicePass, строка имени пользователя) { Случайный r = новый Random(); byte[] userIdContent = CognitoAuthHelper.CombineBytes( Кодировка.UTF8.GetBytes(deviceGroupKey), Кодировка.UTF8.GetBytes(имя пользователя), Кодировка.UTF8.GetBytes(":"), Кодировка.UTF8.GetBytes(devicePass) ); byte[] userIdHash = CognitoAuthHelper.Sha256.ComputeHash(userIdContent); байт[] saltBytes = новый байт[16]; RandomNumberGenerator.Create().GetBytes(saltBytes); // установка начального байта в 0-127, чтобы избежать отрицательной соли или ошибки проверки пароля saltBytes[0] = (байт)r.Next(sbyte.MaxValue); byte[] xBytes = CognitoAuthHelper.CombineBytes(saltBytes, userIdHash); byte[] xDigest = CognitoAuthHelper.Sha256.ComputeHash(xBytes); BigInteger x = BigIntegerExtensions.FromUnsignedBigEndian(xDigest); вар v = BigInteger.ModPow(g, x, N); byte[] vBytes = v.ToBigEndianByteArray(); вернуть новый DeviceSecretVerifierConfigType { PasswordVerifier = Convert.ToBase64String(vBytes), Соль = Convert.ToBase64String(saltBytes) }; } внутренний статический байт[] JointBytes(значения параметров byte[][]) { интервал комбинированной длины = 0; байт [] returnBytes; int copyIndex = 0; for (int i = 0; я
Мобильная версия