如何在 ASP.NET MVC 项目中使用身份验证器应用程序实现多因素身份验证?

介绍

增强安全性对于任何应用程序都至关重要,而多因素身份验证 (MFA) 是实现此目标的有效方法。在本文中,我们将介绍在 ASP.NET MVC 项目中使用身份验证器应用程序集成 MFA 的过程。无论您是从头开始还是将 MFA 添加到现有项目,本指南都将提供清晰的分步说明,以帮助您保护应用程序免受未经授权的访问。从设置项目到实现登录方法和生成二维码,我们将介绍创建强大身份验证系统所需的一切。

使用身份验证器应用程序实现多重身份验证的步骤

在这里,我将从头开始,如果你有一个项目,你可以跳过设置步骤。以下是在 ASP.NET MVC 项目中使用身份验证器应用程序实现多因素身份验证的步骤 -

步骤 1. 设置项目

  1. 在 Visual Studio 中,单击“创建新项目”,然后单击“下一步”。
  2. 在模板中选择“ASP.NET Core Web App(Model-View-Controller)”,然后单击“下一步”。
  3. 在“配置新项目”窗口中,命名您的项目,这里我将其命名为“MultiFactorAuthenticationDemo”并单击“下一步”。
  4. 在“附加信息”窗口的“框架”中,选择“.NET 8”,然后单击“创建”。
  5. 现在,项目已创建,项目结构如下图所示。

步骤 2. 安装软件包

现在,让我们安装项目所需的软件包。

  1. 单击“项目”并选择“管理 NuGet 包”。
  2. 在“浏览”的搜索框中输入“Google.Authenticator”。
  3. 选择它并单击“安装”。
  4. 将会打开一个弹出窗口,单击“我接受”。安装后,它将显示在依赖项下的包中。

步骤 3. 在 Appsettings.json 中配置身份验证密钥

现在,我们必须为我们的应用程序创建一个身份验证密钥。它可以是字符、数字或特殊字符的任意组合。我在下面创建了一个演示密钥。

"AuthenticatorKey": "Demo123",

步骤4.创建会话

我将使用会话来存储一些数据,如用户名等。因此,让我们在 program.cs 中添加会话代码。

builder.Services.AddSession(options =>
{options.IdleTimeout = TimeSpan.FromMinutes(30);
});
// ...
app.UseSession();

现在,会话已添加并可供使用。

步骤 5.创建模型

现在,让我们向我们的项目添加一个模型。

public class LoginModel
{public string Username { get; set; }public string Password { get; set; }
}

我们将使用该模型来存储用户名和密码等登录信息。

此外,我将使用另一个模型,即 GlobalData 模型来存储布尔值,并将在稍后的代码中使用它。

public static class GlobalData
{public static bool isLoggedIn { get; set; }
}

该模型将存储用户是否登录。

步骤 6. 创建控制器并添加构造函数

让我们创建一个用于登录和多因素身份验证方法的控制器。我将其命名为“LoginController”。

让我们创建一个构造函数及其属性供其使用。

private readonly IConfiguration _configuration;
public LoginController(IConfiguration configuration)
{_configuration = configuration;
}

稍后我们将使用 _configuration 来访问“AuthenticatorKey”。

步骤 7. 创建登录方法

让我们添加一个登录方法。

[HttpGet]
[Route("login")]
public IActionResult Login()
{GlobalData.isLoggedIn = false;var message = TempData["message"];ViewBag.Message = message;return View();
}

在上面的代码中,我创建了一个 HttpGet 方法来呈现登录视图。在这里,我在“GlobalData.isLoggedIn”中指定了 false。使用 ViewBag 在登录页面上显示消息,以防出现故障。

现在,我们来添加一个login的post方法。

[HttpPost]
[Route("login")]
public ActionResult Verify(LoginModel login)
{string? username = HttpContext.Session.GetString("Username");string isValidStr = HttpContext.Session.GetString("IsValidTwoFactorAuthentication");bool? isValidTwoFactorAuthentication = isValidStr != null ? bool.Parse(isValidStr) : (bool?)null;if (username == null || isValidTwoFactorAuthentication == false || isValidTwoFactorAuthentication == null){if (login.Username == "Admin" && login.Password == "12345"){HttpContext.Session.SetString("Username", login.Username);return RedirectToAction("MultiFactorAuthentication");}}return RedirectToAction("Index");
}

在上面的代码中,我们首先检查会话中是否有数据。如果会话为空且用户名和密码匹配,则我们将在会话中设置用户名并重定向到 MultiFactorAuthentication 进行多因素身份验证。

步骤 7. 添加多重身份验证方法

[HttpGet]
[Route("multi-factor-authentication")]
public IActionResult MultiFactorAuthentication()
{if (HttpContext.Session.GetString("Username") == null){return RedirectToAction("Login");}string? username = HttpContext.Session.GetString("Username");string authKey = _configuration.GetValue<string>("AuthenticatorKey");string userUniqueKey = username + authKey;// Two Factor Authentication SetupTwoFactorAuthenticator twoFacAuth = new();var setupInfo = twoFacAuth.GenerateSetupCode("MultiFactorAuthenticationDemo",username,ConvertSecretToBytes(userUniqueKey, false),300);HttpContext.Session.SetString("UserUniqueKey", userUniqueKey);ViewBag.BarcodeImageUrl = setupInfo.QrCodeSetupImageUrl;ViewBag.SetupCode = setupInfo.ManualEntryKey;return View();
}

在上面的代码中,我创建了一个名为“MultiFactorAuthentication”的方法,它将呈现用于多因素身份验证的二维码。在这里,如果会话中的用户名为空,那么我们将重定向到登录,否则从应用程序设置中获取身份验证密钥,并使用用户名和身份验证密钥的组合创建一个唯一密钥。然后我们将创建 TwoFactorAuthenticator 类的对象,并使用此对象创建一个二维码。现在,我们将这些东西存储在 ViewBag 中以在视图页面上使用它们。

现在,让我们创建一个验证认证码的post方法。

public ActionResult MultiFactorAuthenticate()
{var token = Request.Form["CodeDigit"];TwoFactorAuthenticator TwoFacAuth = new();string? UserUniqueKey = HttpContext.Session.GetString("UserUniqueKey");// bool isValid = TwoFacAuth.ValidateTwoFactorPIN(UserUniqueKey, token);bool isValid = TwoFacAuth.ValidateTwoFactorPIN(UserUniqueKey, token, TimeSpan.FromSeconds(90)); // will be valid for 30 secondsif (isValid){HttpContext.Session.SetString("IsValidTwoFactorAuthentication", "true");GlobalData.isLoggedIn = true;return RedirectToAction("Dashboard");}TempData["message"] = "Google Two Factor PIN is expired or wrong";return RedirectToAction("Login");
}

在上面的代码中,我们将用户输入的代码存储在名为“token”的变量中。然后我们将创建 TwoFactorAuthenticator 类的一个对象,并使用该对象验证输入的密码。如果有效,我们将在会话中将“IsValidTwoFactorAuthentication”存储为 true 值。并在“GlobalData.isLoggedIn”中分配 true 并重定向到仪表板。如果密码错误或已过期,我们将显示一条消息。

public ActionResult Dashboard()
{if (HttpContext.Session.GetString("IsValidTwoFactorAuthentication") == "true"){return View();}else{return RedirectToAction("Login");}
}

在上面的代码中,我为仪表板创建了一个方法,只有当多因素身份验证成功时才会访问该方法。

public ActionResult Logout()
{HttpContext.Session.Remove("UserName");HttpContext.Session.Remove("IsValidTwoFactorAuthentication");HttpContext.Session.Remove("UserUniqueKey");return RedirectToAction("Login");
}

在上面的代码中,我们删除了会话中存储的注销数据。

步骤 8.添加登录视图

要创建视图,请右键单击 Login() 方法,单击“添加视图”,然后命名视图,我将其命名为“Login.cshtml”。您的视图文件已创建。

在 Login.cshtml

<div class="center"><div class="row" id="login"><div id="login-box" class="col-md-12"><h2 class="text-info">Login</h2>@using (Html.BeginForm("Verify", "Login", FormMethod.Post)){<div class="form-group mb-3"><label class="form-label mb-3 required" for="username">Username</label>@Html.TextBoxFor(m => m.Username, new { @class = "form-control", @placeholder = "Username", @required = true })</div><div class="form-group mb-3"><label class="form-label mb-3 required" for="password">Password</label>@Html.PasswordFor(m => m.Password, new { @class = "form-control", @placeholder = "Password", @required = true })</div><div class="form-group text-center"><input type="submit" name="submit" class="btn btn-success" value="Login"></div>}</div><div>@ViewBag.Message</div></div>
</div>

在上面的代码中,我添加了一个表单来获取用户名和密码。如果有错误消息,它将显示在下面。

步骤 9.添加多重身份验证视图

右键单击 MultiFactorAuthentication() 方法,单击“添加视图”,然后命名视图,我将其命名为“MultiFactorAuthentication.cshtml”。您的视图文件已创建。

<div class="center"><div class="row" id="login"><div id="login-box" class="col-md-12"><div class="mb-3"><img src="@ViewBag.BarcodeImageUrl" width="300" height="300" /></div><div class="row mb-3">Manual Setup Code : @ViewBag.SetupCode</div><div>@using (Html.BeginForm("MultiFactorAuthenticate", "Login", FormMethod.Post)){<div class="form-group mb-3"><label class="form-label mb-3 required" for="username">Code</label><input type="text" class="form-control" placeholder="Enter Authenticator Code" name="CodeDigit" /></div><div class="form-group text-center"><input type="submit" class="btn btn-success" /></div>}</div></div></div>
</div>

在上面的代码中,我展示了用户将在任何身份验证器应用程序(Google 或 Microsoft Authenticator)中扫描的二维码。然后是手动设置代码。然后我添加了一个表单来获取身份验证器代码。

在这里,用户可以使用二维码或身份验证器应用程序中的设置代码来获取代码。

步骤 10. 添加仪表板视图

右键单击 Dashboard() 方法,单击“添加视图”,然后命名视图,我将其命名为“Dashboard.cshtml”。您的视图文件已创建。

<div>Hey, you have successfully logged in using Multi factor authentication.
</div>

在这里,我向用户展示了一个演示消息,该消息将显示一次,用户完成多因素身份验证。

现在,您可以运行该应用程序。

这是登录视图。提交表单后,将打开下一页。

在这里,用户可以扫描代码或在身份验证器应用中输入设置代码来获取代码。然后用户将提交代码。如果代码有效,则将显示仪表板。


现在,我们已经在 ASP.NET MVC 项目中成功实现了多因素身份验证。

结论

在 ASP.NET MVC 项目中使用身份验证器应用实现多因素身份验证 (MFA) 可增强用户身份验证的安全性。该过程包括设置项目、配置身份验证密钥以及创建登录和验证所需的模型和控制器。通过集成双因素身份验证系统,用户需要提供由身份验证器应用生成的额外验证码,从而显著提高对未经授权访问的保护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生物素标记降钙素Biotin-α-CGRP, rat 中间体

生物素标记降钙素Biotin-α-CGRP, rat 中间体是一种特定的生物化学试剂&#xff0c;主要用于科学研究领域。以下是对该产品的详细介绍&#xff1a; 一、基本信息 产品名称&#xff1a;生物素标记降钙素Biotin-α-CGRP, rat 中间体 英文名称&#xff1a;Biotin-α-CGRP, rat 纯度…

Qt 线程同步机制 互斥锁 信号量 条件变量 读写锁

qt线程同步 Qt提供了丰富的线程同步机制来帮助开发者更高效和安全地进行多线程编程。其主要包括: QMutex:为共享数据提供互斥访问能力,避免同时写入导致的数据冲突。利用lock()/unlock()方法实现锁定和解锁。 QReadWriteLock:读写锁,允许多个读线程同时访问,但写操作需要独占…

springboot社区物资交易互助平台+lw+源码+调试+讲解

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料&#xff0c;分析人员可以根据这些信息确定出本系统具备的功能&#xff0c;分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作&#xff0c;但…

windows USB 设备驱动开发-USB带宽

本文讨论如何仔细管理 USB 带宽的指导。 每个 USB 客户端驱动程序都有责任最大程度地减少其使用的 USB 带宽&#xff0c;并尽快将未使用的带宽返回到可用带宽池。 在这里&#xff0c;我们认为USB 2.0 的速度是480Mbps、12Mbps、1.5Mbps&#xff0c;这分别对应高速、全速、低速…

Python面试宝典第9题:买卖股票

题目 给定一个整型数组&#xff0c;它的第i个元素是一支给定股票第i天的价格。如果最多只允许完成一笔交易&#xff08;即买入和卖出一支股票一次&#xff09;&#xff0c;设计一个算法来计算你所能获取的最大利润。注意&#xff1a;你不能在买入股票前卖出股票。 示例 1&#…

LabVIEW平台从离散光子到连续光子的光子计数技术

光子计数技术用于将输入光子数转换为离散脉冲。常见的光子计数器假设光子是离散到达的&#xff0c;记录到来的每一个光子。但是&#xff0c;当两个或多个光子同时到达时&#xff0c;计数器会将其记录为单个脉冲&#xff0c;从而只计数一次。当连续光子到达时&#xff0c;离散光…

python学习-容器类型

列表 列表&#xff08;list&#xff09;是一种有序容器&#xff0c;可以向其中添加或删除任意元素. 列表数据类型是一种容器类型&#xff0c;列表中可以存放不同数据类型的值,代码示例如下&#xff1a; 列表中可以实现元素的增、删、改、查。 示例代码如下&#xff1a; 增 …

基于Unity3D的Rokid AR Glass项目开发环境搭建

初识Rokid AR 一、SDK简介二、准备工作1.软件环境2.硬件环境 三、快速接入SDK1.配置Package Manager2.安装UXR2.0 SDK 四、导入官方Demo进行模拟器测试五、Rokid AR系列教程 一、SDK简介 UXR2.0 SDK是Rokid为Unity开发者提供的AR开发工具包&#xff0c;提供空间定位跟踪、双目…

Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)

netsh int ip reset 命令是用于重置 Windows 操作系统中的网络设置和配置的命令。 在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。 命令详解&#xff1a; netsh: 用于配置各种网络设置 int: 用于管理网络接口 ip: 用于管理网络接口的 IP 配…

学习嵌入式对于学历有要求吗?

学习嵌入式系统开发通常并不对学历有严格的要求&#xff0c;尤其是在技术行业中&#xff0c;实际的技能和经验往往比学历更为重要。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕…

Swift 中 map 和 flatMap 的区别 (入门版)

在 Swift 中&#xff0c;map 和 flatMap 是用于处理集合类型&#xff08;如数组、字典、集合等&#xff09;的两个重要方法。尽管它们看起来相似&#xff0c;但它们在处理集合中的元素和结果时有着不同的行为。 map 方法 map 方法会对集合中的每一个元素应用一个变换&#xff…

Ubuntu 24.04 LTS (Linux) 安装二维码生成工具 QRencode 二维码生成和识别

1 Ubuntu 安装 sudo apt update sudo apt-get install qrencode 2 查看版本 qrencode -V 3 生成二维码 qrencode -o test.png http://www.baidu.com 可以下载test.png图片,用手机浏览器扫描下看(⊙﹏⊙)

FPGA 项目菜单功能比较

为了帮助您更好地理解每个FPGA功能模块的实用场合、区别和特点&#xff0c;以下是详细的比较&#xff1a; 功能模块实用场合区别特点FPGA I/O自动控制系统、数据采集系统直接与FPGA板卡上的物理端口交互&#xff0c;配置和使用外部I/O设备灵活配置输入输出端口&#xff0c;支持…

Day62 单调栈part01

LC739每日温度(未掌握) 暴力解法&#xff1a;两层for循环&#xff0c;时间复杂度O(n^2)&#xff0c;会超时未掌握原因分析&#xff1a;只想到了从栈顶到栈底是递减的情况&#xff0c;忽略了从栈顶到栈底是递增的情况 因为需要找到一个元素右边第一个更大元素&#xff0c;只有…

寂静孤独的404页面源码

寂静孤独的404页面源码&#xff0c;灯光闪烁动态效果&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 寂静孤独的404页面源…

【深度学习】PyTorch深度学习笔记01-Overview

参考学习&#xff1a;B站视频【《PyTorch深度学习实践》完结合集】-刘二大人 ------------------------------------------------------------------------------------------------------- 1. 基于规则的深度学习 2. 经典的机器学习——手动提取一些简单的特征 3. 表示学习…

深入理解 LXC (Linux Containers)

目录 引言LXC 的定义LXC 的架构LXC 的工作原理LXC 的应用场景LXC 在 CentOS 上的常见命令实验场景模拟总结 1. 引言 在现代 IT 基础设施中&#xff0c;容器技术已经成为一种重要的应用和部署方式。与虚拟机相比&#xff0c;容器具有更高的效率、更轻量的特性和更快的启动速度…

AI应用观:从“卷模型”到“卷应用”的时代跨越

在2024年世界人工智能大会的舞台上&#xff0c;百度创始人李彦宏的发言如同一股清流&#xff0c;为当前如火如荼的人工智能领域注入了深刻的思考。他提出的“大家不要卷模型&#xff0c;要卷应用”的观点&#xff0c;不仅是对当前AI技术发展趋势的精准洞察&#xff0c;更是对未…

【PB案例学习笔记】-30动态打开窗口

写在前面 这是PB案例学习笔记系列文章的第30篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

Mosh|内连接、外连接、左连接、右连接(未完)

下图取自菜鸟教程&#xff0c;侵权删&#xff5e; 一、内连接&#xff1a;Inner Joins 模版&#xff1a;SELECT * FROM A JOIN B ON 条件 含义&#xff1a;返回A与B的交集&#xff0c;列为AB列之和 练习&#xff1a;将order_items表和products表连接&#xff0c;返回产品id和…