.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í:
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";
}