如何在ASP.NET Core 6中为特定操作触发即时MFA验证?
为ASP.NET Core 6敏感操作触发额外Azure AD MFA验证
你可以通过代码触发额外的MFA验证,同时结合少量Azure AD配置实现精准控制,无需完全依赖企业应用的全局配置。以下是具体方案:
核心逻辑
先检查当前用户会话是否已完成MFA验证,若未完成则触发Azure AD的强制MFA重新认证,验证通过后再执行敏感操作。用户完成MFA后,Azure AD会在ID令牌中携带amr(Authentication Method Reference)声明,值为mfa,我们可以通过这个Claim判断验证状态。
完整代码实现
敏感操作的Action代码
using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.OpenIdConnect; public IActionResult OnGet() { if (User.Identity is not { IsAuthenticated: true }) return Forbid(); // 检查当前会话是否已通过MFA验证 var hasMfaValidation = User.Claims.Any(c => c.Type == "amr" && c.Value == "mfa"); if (!hasMfaValidation) { // 配置重新认证参数:强制要求MFA,验证完成后返回当前操作 var authProperties = new AuthenticationProperties { RedirectUri = Url.Action(nameof(OnGet)), Items = { { "acr_values", "amr:mfa" } } }; return Challenge(authProperties, OpenIdConnectDefaults.AuthenticationScheme); } // 执行密码重置等敏感操作 User.ChangePassword(); return RedirectToAction(nameof(Profile)); }
调整认证服务配置(Program.cs)
确保Azure AD能接收我们传递的强制MFA参数:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"), options => { options.Events = new OpenIdConnectEvents { OnRedirectToIdentityProvider = context => { // 将强制MFA的参数传递给Azure AD if (context.Properties.Items.TryGetValue("acr_values", out var acrValues)) { context.ProtocolMessage.AcrValues = acrValues; } return Task.CompletedTask; } }; });
配套Azure AD配置
- 在Azure AD应用注册的令牌配置中,确保添加了
amr声明(默认通常已包含,若缺失可手动添加)。 - 若需要全局兜底规则,可在Azure AD条件访问策略中针对该应用设置MFA,但代码触发的方式更灵活,仅对指定敏感操作生效。
内容的提问来源于stack exchange,提问作者Norman
相关产品推荐
相关产品推荐

