启用在标识中生成 QR 码

启用在 ASP.NET Core TOTP 身份验证器应用的 QR 代码生成

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

ASP.NET Core 附带的单个身份验证的身份验证器应用程序的支持。 两个身份验证 (2FA) 身份验证器应用程序,使用基于时间的一次性密码算法 (TOTP),是推荐的方法用于 2FA 的行业。 2FA 使用 TOTP 优于 SMS 2FA。 身份验证器应用程序提供了哪些用户必须输入其用户名和密码确认后一个 6 到 8 位代码。 通常智能手机上安装验证器应用。

ASP.NET Core web 应用程序模板支持身份验证器,但不提供对 QRCode 生成的支持。 QRCode 生成器简化 2FA 的安装程序。 本文档将指导你完成添加QR 码生成到 2FA 配置页。

如使用外部身份验证提供程序,不会发生双因素身份验证GoogleFacebook 受保护的外部登录名通过任何机制提供外部登录提供程序。 例如,请考虑Microsoft身份验证提供程序需要硬件密钥或另一种 2FA 方法。 如果默认模板强制实施"local"2FA 然后会要求用户以满足两个 2FA 方法,这是不常使用的方案。

将 QR 代码添加到 2FA 配置页

使用这些说明qrcode.jshttps://davidshimjs.github.io/qrcodejs/存储库。

  • 按照中的说明基架标识生成 /Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml
  • 在中 /Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml,找到Scripts文件的末尾部分:
  • 在中Pages/Account/Manage/EnableAuthenticator.cshtml (Razor 页面) 或Views/Manage/EnableAuthenticator.cshtml (MVC) 中,找到Scripts文件的末尾部分:
@section Scripts {
    @await Html.PartialAsync("_ValidationScriptsPartial")
}
  • 更新Scripts部分,以添加对引用qrcodejs您添加的库和生成 QR 代码的调用。 其外观应按如下所示:
@section Scripts {
    @await Html.PartialAsync("_ValidationScriptsPartial")

    <script type="text/javascript" src="~/lib/qrcode.js"></script>
    <script type="text/javascript">
        new QRCode(document.getElementById("qrCode"),
            {
                text: "@Html.Raw(Model.AuthenticatorUri)",
                width: 150,
                height: 150
            });
    </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 (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 代码库可以替换你首选的库。 包含 HTMLqrCode元素在其中可以通过任何机制将 QR 代码库提供。

QR 码的格式正确 URL 现已推出:

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

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

TOTP (基于时间的一次性密码) 身份验证依赖于服务器和身份验证器的设备具有准确的时间。 令牌仅持续 30 秒。 如果 TOTP 2FA 登录名失败,则检查服务器时间是准确的并且最好是同步到准确的 NTP 服务。

目录