Categories: ASP.NET

Двухфакторная аутентификация при помощи Google AUTHENTICATOR

Во-первых, необходимо установить open source package под названием OTP Sharp для валидации TOTP кода.

Далее следует создать метод для вывода QR-кода на страницу:

[HttpGet]
public async Task EnableGoogleAuthenticator()
{
    byte[] secretKey = KeyGeneration.GenerateRandomKey(20);
    string userName = User.Identity.GetUserName();
    string barcodeUrl = KeyUrl.GetTotpUrl(secretKey, userName) + "&issuer=MySuperApplication";

    var model = new GoogleAuthenticatorViewModel
    {
        SecretKey = Base32Encoder.Encode(secretKey),
        BarcodeUrl = HttpUtility.UrlEncode(barcodeUrl)
    };
    return View(model); 
}

Разметка для базового представления может быть следующей:

 

 

1\. Add MySuperApplication to Google Authenticator

 

Open Google Authenticator and add MySuperApplication by scanning the QR Code to the right.

 

2\. Enter the 6 digit code that Google Authenticator generates

 

Verify that MySuperApplication is added correctly in Google Authenticator by entering the 6 digit code which Google Authenticator generates for MySuperApplication below, and then click Enable.

@using (Html.BeginForm(“EnableGoogleAuthenticator”, “Manage”, FormMethod.Post, new { @class = “form-horizontal”, role = “form” })) { @Html.AntiForgeryToken() @Html.ValidationSummary(false) @Html.HiddenFor(m => m.SecretKey) @Html.HiddenFor(m => m.BarcodeUrl)

@Html.LabelFor(m => m.Code, new { @class = “col-md-2 control-label” })

@Html.TextBoxFor(m => m.Code, new { @class = “form-control” })

 

 

 

 

}

 

 

 

Представление покажет QR-код, который следует считать пользователю с помощью приложения для мобильного Google AUTHENTICATOR. В результате будет получен код для валидации:

[HttpPost]
public async Task EnableGoogleAuthenticator(GoogleAuthenticatorViewModel model)
{
    if (ModelState.IsValid)
    {
        byte[] secretKey = Base32Encoder.Decode(model.SecretKey);

        long timeStepMatched = 0;
        var otp = new Totp(secretKey);
        if (otp.VerifyTotp(model.Code, out timeStepMatched, new VerificationWindow(2, 2)))
        {
            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
            user.IsGoogleAuthenticatorEnabled = true;
            user.GoogleAuthenticatorSecretKey = model.SecretKey;
            await UserManager.UpdateAsync(user);

            return RedirectToAction("Index", "Manage");
        }
        else
            ModelState.AddModelError("Code", "The Code is not valid");
    }

    return View(model);
}

Ссылка на источник

 

 

 

Руслан Раянов

Recent Posts

Что такое Customer Development (кастдев)? #понятия_веб_разработки #вебликбез

https://falconspace.ru/blog/bazovye-voprosy-i-ponyatiya-v-sfere-sozdaniya-veb-proektov - Основы веб-разработки. Базовые понятия для владельца сайта

17 часов ago

Что такое Целевая аудитория? #понятия_веб_разработки #вебликбез

https://falconspace.ru/blog/bazovye-voprosy-i-ponyatiya-v-sfere-sozdaniya-veb-proektov - Основы веб-разработки. Базовые понятия для владельца сайта

2 дня ago

Что такое Концепция сайта? Что такое Бриф на разработку сайта? #понятия_веб_разработки #вебликбез

https://falconspace.ru/blog/bazovye-voprosy-i-ponyatiya-v-sfere-sozdaniya-veb-proektov - Основы веб-разработки. Базовые понятия для владельца сайта

3 дня ago

Каким должен быть личный кабинет информационной системы?

Вероятно, у вас есть сайт и вы подумываете, что было бы неплохо внедрить в него…

4 дня ago

Что такое Итерация, этап, спринт? #понятия_веб_разработки #вебликбез

https://falconspace.ru/blog/bazovye-voprosy-i-ponyatiya-v-sfere-sozdaniya-veb-proektov - Основы веб-разработки. Базовые понятия для владельца сайта

7 дней ago

Что такое Рейт эстимейт почасовая ставка? #понятия_веб_разработки #вебликбез

https://falconspace.ru/blog/bazovye-voprosy-i-ponyatiya-v-sfere-sozdaniya-veb-proektov - Основы веб-разработки. Базовые понятия для владельца сайта

1 неделя ago