如何在我的 .Net Core Identity Web App 中实施 2FA
How to enforce 2FA in my .Net Core Identity Web App
我有一个带有标识的 .net 核心 MVC 网络应用程序。 2FA 工作正常。然而,问题是 2FA 并未强制执行。我可以登录,进入 'set up 2fa by scanning QR code' 页面,然后简单地导航到我网站的根目录以绕过设置 2fa。
我已经关注了
中的最佳答案
(我也试过https://docs.microsoft.com/en-us/aspnet/core/security/authentication/mfa?view=aspnetcore-5.0#force-aspnet-core-openid-connect-client-to-require-mfa but one of the code snippets in there has a syntax error - https://imgur.com/a/kAQOMRW)
但这并没有奏效。当我使用 2fa 登录时,访问被拒绝。我什至尝试在方法 CreateAsync
中放置一个断点,但它似乎永远不会被击中。
我完成的步骤:
已将 class AdditionalUserClaimsPrincipalFactory
添加到我的项目中:
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using PhotoUploaderForm.Models;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
namespace IdentityStandaloneMfa
{
public class AdditionalUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
public AdditionalUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager,
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, roleManager, optionsAccessor)
{
}
public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var principal = await base.CreateAsync(user);
var identity = (ClaimsIdentity)principal.Identity;
var claims = new List<Claim>();
if (user.TwoFactorEnabled)
{
claims.Add(new Claim("TwoFactorEnabled", "true"));
}
else
{
claims.Add(new Claim("TwoFactorEnabled", "false")); ;
}
identity.AddClaims(claims);
return principal;
}
}
}
在 ConfigureServices
中添加了以下内容:
services.AddAuthorization(options =>
options.AddPolicy("TwoFactorEnabled",
x => x.RequireClaim("amr", "mfa")));
为了测试这个,在我的家庭控制器上我有以下属性 [Authorize(Policy = "TwoFactorEnabled")]
我是否遗漏了任何其他步骤?我已经为此苦苦挣扎了好几天。如有任何帮助,我们将不胜感激,
谢谢
用户身份验证成功后,检查是否启用双因素身份验证,然后将用户重定向到将交叉检查 OTP 的页面,您也可以添加一个选项以再次发送 OTP,请检查此 link更多帮助 link, also check
不确定这是否会解决您与 MFA 相关的所有问题,但在 ConfigureServices 中,您正在为 'TwoFactorEnabled' 添加一个策略,该策略要求用户拥有值为“mfa”的“amr”声明。但是,似乎没有为 AdditionalUserClaimsPrincipalFactory 中的用户添加此声明。相反,您设置了值为“true”的“TwoFactorEnabled”声明。
如果将 ConfigureServices 中的代码更新为:
services.AddAuthorization(options =>
options.AddPolicy("TwoFactorEnabled",
x => x.RequireClaim("TwoFactorEnabled", "true")));
在 ConfigureServices 中,您还需要添加一些代码来注入您的 AdditionalUserClaimsPrincipalFactory。将此行添加到 ConfigureServices 应该确保您的 AdditionalUserClaimsPrincipalFactory 在用户登录时被调用:
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AdditionalUserClaimsPrincipalFactory>();
我有一个带有标识的 .net 核心 MVC 网络应用程序。 2FA 工作正常。然而,问题是 2FA 并未强制执行。我可以登录,进入 'set up 2fa by scanning QR code' 页面,然后简单地导航到我网站的根目录以绕过设置 2fa。
我已经关注了
(我也试过https://docs.microsoft.com/en-us/aspnet/core/security/authentication/mfa?view=aspnetcore-5.0#force-aspnet-core-openid-connect-client-to-require-mfa but one of the code snippets in there has a syntax error - https://imgur.com/a/kAQOMRW)
但这并没有奏效。当我使用 2fa 登录时,访问被拒绝。我什至尝试在方法 CreateAsync
中放置一个断点,但它似乎永远不会被击中。
我完成的步骤:
已将 class AdditionalUserClaimsPrincipalFactory
添加到我的项目中:
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using PhotoUploaderForm.Models;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
namespace IdentityStandaloneMfa
{
public class AdditionalUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
public AdditionalUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager,
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, roleManager, optionsAccessor)
{
}
public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var principal = await base.CreateAsync(user);
var identity = (ClaimsIdentity)principal.Identity;
var claims = new List<Claim>();
if (user.TwoFactorEnabled)
{
claims.Add(new Claim("TwoFactorEnabled", "true"));
}
else
{
claims.Add(new Claim("TwoFactorEnabled", "false")); ;
}
identity.AddClaims(claims);
return principal;
}
}
}
在 ConfigureServices
中添加了以下内容:
services.AddAuthorization(options =>
options.AddPolicy("TwoFactorEnabled",
x => x.RequireClaim("amr", "mfa")));
为了测试这个,在我的家庭控制器上我有以下属性 [Authorize(Policy = "TwoFactorEnabled")]
我是否遗漏了任何其他步骤?我已经为此苦苦挣扎了好几天。如有任何帮助,我们将不胜感激,
谢谢
用户身份验证成功后,检查是否启用双因素身份验证,然后将用户重定向到将交叉检查 OTP 的页面,您也可以添加一个选项以再次发送 OTP,请检查此 link更多帮助 link, also check
不确定这是否会解决您与 MFA 相关的所有问题,但在 ConfigureServices 中,您正在为 'TwoFactorEnabled' 添加一个策略,该策略要求用户拥有值为“mfa”的“amr”声明。但是,似乎没有为 AdditionalUserClaimsPrincipalFactory 中的用户添加此声明。相反,您设置了值为“true”的“TwoFactorEnabled”声明。
如果将 ConfigureServices 中的代码更新为:
services.AddAuthorization(options =>
options.AddPolicy("TwoFactorEnabled",
x => x.RequireClaim("TwoFactorEnabled", "true")));
在 ConfigureServices 中,您还需要添加一些代码来注入您的 AdditionalUserClaimsPrincipalFactory。将此行添加到 ConfigureServices 应该确保您的 AdditionalUserClaimsPrincipalFactory 在用户登录时被调用:
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AdditionalUserClaimsPrincipalFactory>();