在应用程序中为 TOTP 验证器应用启用 QR ASP.NET Core

QR 码需要 ASP.NET Core 2.0 或更高版本。

ASP.NET Core支持身份验证器应用程序进行个人身份验证。 使用基于 (一) 密码算法 (TOTP) 的双因素身份验证和 2FA 身份验证器应用是行业推荐的 2FA 方法。 使用 TOTP 进行 2FA 比使用 SMS 2FA 更可取。 验证器应用提供 6 到 8 位代码,用户在确认用户名和密码后必须输入该代码。 通常,验证器应用安装在智能手机上。

ASP.NET Core Web 应用模板支持验证器,但不为 QRCode 生成提供支持。 QRCode 生成器可简化 2FA 的设置。 本文档将指导你完成将 QR 码 生成添加到 2FA 配置页。

使用外部身份验证提供程序(如 GoogleFacebook)不会发生双重身份验证。 外部登录名受外部登录提供程序提供的任何机制保护。 例如,假设 Microsoft 身份验证提供程序需要硬件密钥或其他 2FA 方法。 如果默认模板强制执行"本地"2FA,则用户需要满足两种 2FA 方法,这不是常用的方案。

将 QR 码添加到 2FA 配置页

这些说明 qrcode.js 存储库 https://davidshimjs.github.io/qrcodejs/ 的说明。

  • 按照基架 中的说明生成 Identity /Areas/ Identity /Pages/Account/Manage/EnableAuthenticator.cshtml
  • /Areas/ Identity /Pages/Account/Manage/EnableAuthenticator.cshtml 中,找到文件 Scripts 末尾的 部分:
  • Pages/Account/Manage/EnableAuthenticator.cshtml (Razor Pages) 或 Views/Manage/EnableAuthenticator.cshtml (MVC) 中,找到文件末尾的 部分 Scripts
@section Scripts {
    @await Html.PartialAsync("_ValidationScriptsPartial")
}
  • wwwroot/js qr.js 名为qr.jsJavaScript 文件,并添加以下代码以生成 QR 码:
window.addEventListener("load", () => {
    const uri = document.getElementById("qrCodeData").getAttribute('data-url');
    new QRCode(document.getElementById("qrCode"),
        {
            text: uri,
            width: 150,
            height: 150
        });
});
  • 更新 Scripts 部分以添加对以前 qrcode.js 下载的库的引用。
  • 添加 qr.js 调用以生成 QR 码:
@section Scripts {
    @await Html.PartialAsync("_ValidationScriptsPartial")

    <script type="text/javascript" src="~/lib/qrcode.js"></script>
    <script type="text/javascript" src="~/js/qs.js"></script>
}
  • 删除链接到这些说明的段落。

运行应用,并确保可以扫描 QR 码并验证验证器证明的代码。

在 QR 代码中更改站点名称

QR 代码中的站点名称取自最初创建项目时选择的项目名称。 可以通过在 GenerateQrCodeUri(string email, string unformattedKey) /Areas/ Identity /Pages/Account/Manage/EnableAuthenticator.cshtml.cs 中查找 方法来更改它。

QR 代码中的站点名称取自最初创建项目时选择的项目名称。 可以通过在 GenerateQrCodeUri(string email, string unformattedKey) Pages/Account/Manage/EnableAuthenticator.cshtml.cs (Pages) 文件或 Razor Controllers/ManageController.cs (MVC) 文件中查找 方法来更改它。

模板中的默认代码如下所示:

private string GenerateQrCodeUri(string email, string unformattedKey)
{
    return string.Format(
        AuthenticatorUriFormat,
        _urlEncoder.Encode("Razor Pages"),
        _urlEncoder.Encode(email),
        unformattedKey);
}

调用 的第二个参数 string.Format 是站点名称,取自解决方案名称。 它可以更改为任何值,但必须始终进行 URL 编码。

使用不同的 QR 码库

可以将 QR 码库替换为首选库。 HTML 包含一 qrCode 个元素,可以通过库提供的任何机制将 QR 码放置到该元素中。

QR 码的格式正确的 URL 位于:

  • AuthenticatorUri 模型的 属性。
  • data-url 元素中的 qrCodeData 属性。

TOTP 客户端和服务器时间倾斜

TOTP (基于One-Time密码) 身份验证取决于服务器和验证器设备是否具有准确的时间。 令牌仅持续 30 秒。 如果 TOTP 2FA 登录失败,请检查服务器时间是否准确,并且最好同步到准确的 NTP 服务。