two recuperar instalar google factor descargar code authenticator .net google-authenticator two-factor-authentication

.net - recuperar - instalar google authenticator pc



¿Hay algún tutorial sobre cómo implementar Google Authenticator en aplicaciones.NET? (5)

Después de un poco de investigación y prueba, creé mi propia "prueba de concepto" sobre cómo puede generar una imagen QR, escanearla desde su teléfono y luego verificar que el código PIN en el teléfono sea correcto. Tal vez esto podría desarrollarse más como una biblioteca si alguien quiere unirse? El código se puede encontrar aquí:

https://github.com/esp0/googleAuthNet

Estoy buscando un tutorial sobre cómo usar Google Authenticator en .NET-apps. ¿Existe esto? De ser así, ¿dónde puedo encontrarlo?

Entiendo que esto se puede usar para agregar autenticación de dos factores a sus propias aplicaciones.


La pregunta solicitó un tutorial que el otro responde que no me siento cubierto,

uno se puede encontrar en:

http://www.codeproject.com/Articles/403355/Implementing-Two-Factor-Authentication-in-ASP-NET

El tutorial fue escrito por Rick Bassham y cubre información sobre:

"Qué es la autenticación de dos factores" "Qué es Google Authenticator" "Cómo funciona"

A continuación, explica cómo implementar código para:

"Generación de contraseñas basada en una vez" "Generación de contraseñas basada en tiempo"

Y ofrece un tutorial completo con Visual Studio 2010 en:

"¿Cómo lo uso?"


Mientras jugaba con Google Authenticator, me encontré con esta pregunta y, en particular, el código aportado por Espo. Personalmente, no estaba satisfecho con la conversión de Java a C #, así que pensé en compartir mi versión. Aparte de refactorizar fuertemente el código:

  • Se introdujo el control para el pedido de bytes little-endian y se convirtió a big-endian según sea necesario.
  • Parámetro introducido para la clave HMAC.

Para obtener más información sobre el formato de url de aprovisionamiento, consulte también: https://github.com/google/google-authenticator/wiki/Key-Uri-Format

Siéntase libre de usar si lo desea, y gracias a Espo por el trabajo inicial.

using System; using System.Globalization; using System.Net; using System.Security.Cryptography; using System.Text; public class GoogleAuthenticator { const int IntervalLength = 30; const int PinLength = 6; static readonly int PinModulo = (int)Math.Pow(10, PinLength); static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); /// <summary> /// Number of intervals that have elapsed. /// </summary> static long CurrentInterval { get { var ElapsedSeconds = (long)Math.Floor((DateTime.UtcNow - UnixEpoch).TotalSeconds); return ElapsedSeconds/IntervalLength; } } /// <summary> /// Generates a QR code bitmap for provisioning. /// </summary> public byte[] GenerateProvisioningImage(string identifier, byte[] key, int width, int height) { var KeyString = Encoder.Base32Encode(key); var ProvisionUrl = Encoder.UrlEncode(string.Format("otpauth://totp/{0}?secret={1}&issuer=MyCompany", identifier, KeyString)); var ChartUrl = string.Format("https://chart.apis.google.com/chart?cht=qr&chs={0}x{1}&chl={2}", width, height, ProvisionUrl); using (var Client = new WebClient()) { return Client.DownloadData(ChartUrl); } } /// <summary> /// Generates a pin for the given key. /// </summary> public string GeneratePin(byte[] key) { return GeneratePin(key, CurrentInterval); } /// <summary> /// Generates a pin by hashing a key and counter. /// </summary> static string GeneratePin(byte[] key, long counter) { const int SizeOfInt32 = 4; var CounterBytes = BitConverter.GetBytes(counter); if (BitConverter.IsLittleEndian) { //spec requires bytes in big-endian order Array.Reverse(CounterBytes); } var Hash = new HMACSHA1(key).ComputeHash(CounterBytes); var Offset = Hash[Hash.Length - 1] & 0xF; var SelectedBytes = new byte[SizeOfInt32]; Buffer.BlockCopy(Hash, Offset, SelectedBytes, 0, SizeOfInt32); if (BitConverter.IsLittleEndian) { //spec interprets bytes in big-endian order Array.Reverse(SelectedBytes); } var SelectedInteger = BitConverter.ToInt32(SelectedBytes, 0); //remove the most significant bit for interoperability per spec var TruncatedHash = SelectedInteger & 0x7FFFFFFF; //generate number of digits for given pin length var Pin = TruncatedHash%PinModulo; return Pin.ToString(CultureInfo.InvariantCulture).PadLeft(PinLength, ''0''); } #region Nested type: Encoder static class Encoder { /// <summary> /// Url Encoding (with upper-case hexadecimal per OATH specification) /// </summary> public static string UrlEncode(string value) { const string UrlEncodeAlphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"; var Builder = new StringBuilder(); for (var i = 0; i < value.Length; i++) { var Symbol = value[i]; if (UrlEncodeAlphabet.IndexOf(Symbol) != -1) { Builder.Append(Symbol); } else { Builder.Append(''%''); Builder.Append(((int)Symbol).ToString("X2")); } } return Builder.ToString(); } /// <summary> /// Base-32 Encoding /// </summary> public static string Base32Encode(byte[] data) { const int InByteSize = 8; const int OutByteSize = 5; const string Base32Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; int i = 0, index = 0; var Builder = new StringBuilder((data.Length + 7)*InByteSize/OutByteSize); while (i < data.Length) { int CurrentByte = data[i]; int Digit; //Is the current digit going to span a byte boundary? if (index > (InByteSize - OutByteSize)) { int NextByte; if ((i + 1) < data.Length) { NextByte = data[i + 1]; } else { NextByte = 0; } Digit = CurrentByte & (0xFF >> index); index = (index + OutByteSize)%InByteSize; Digit <<= index; Digit |= NextByte >> (InByteSize - index); i++; } else { Digit = (CurrentByte >> (InByteSize - (index + OutByteSize))) & 0x1F; index = (index + OutByteSize)%InByteSize; if (index == 0) { i++; } } Builder.Append(Base32Alphabet[Digit]); } return Builder.ToString(); } } #endregion }


No encontré un tutorial, pero parece que escribir un puerto no sería tan difícil. Es una aplicación Java y está basada en estándares existentes (HMAC SHA1).

Consulte esta página para obtener más información sobre las agallas sin GUI:

Y vea estas páginas para obtener información sobre portar y un puerto de Silverlight existente (no oficial):


Para agregar la Autenticación de Google de dos factores con Google Authenticator, necesita lo siguiente

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Security.Cryptography; using System.Text; using System.Web.Profile; using System.Web.Security; using Google.Authenticator;

Para obtener Google.Authenticator; mira aquí https://www.nuget.org/packages/GoogleAuthenticator

ahora configurando la autenticación de Google.

TwoFactorAuthenticator tfa = new TwoFactorAuthenticator(); var setupInfo = tfa.GenerateSetupCode("Name of the app", "More info ABout the App", "SuperSecretKeyGoesHere", 300 , 300); //the width and height of the Qr Code in pixels string qrCodeImageUrl = setupInfo.QrCodeSetupImageUrl; // assigning the Qr code information + URL to string string manualEntrySetupCode = setupInfo.ManualEntryKey; // show the Manual Entry Key for the users that don''t have app or phone Image1.ImageUrl = qrCodeImageUrl;// showing the qr code on the page "linking the string to image element" Label1.Text = manualEntrySetupCode; // showing the manual Entry setup code for the users that can not use their phone

puede cambiar SuperSecretKeyGoesHere a cualquier valor que desee, pero asegúrese de que tenga más de 10 caracteres; de lo contrario, la clave de entrada manual que se genera no funcionará. Ahora puede verificar la entrada del usuario con el cuadro de texto y hacer clic en el botón

este bit mirará la entrada del usuario y verá si está bien

string user_enter=TextBox1.Text; TwoFactorAuthenticator tfa = new TwoFactorAuthenticator(); bool isCorrectPIN = tfa.ValidateTwoFactorPIN("SuperSecretKeyGoesHere", user_enter); if (isCorrectPIN == true) { Label2.Text = "i am cool"; } else { Label2.Text = "i am Fool"; }