You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助MSAL或Azure API实现启用MFA账户的无交互登录?

保留MFA的无交互登录解决方案(Azure Function场景)

针对你需要在Azure Function中无交互获取启用MFA的用户账户访问令牌的需求,以下是几种可行方案:

方案1:设备代码流(Device Code Flow)

适合需要一次性用户授权,后续可自动刷新令牌的场景。流程是通过生成设备代码让用户完成一次MFA验证,之后保存刷新令牌用于后续自动获取新令牌。

代码示例(MSAL.NET)

using Microsoft.Identity.Client;

var clientId = "你的Azure AD应用客户端ID";
var tenantId = "你的租户ID";
var scopes = new[] { "https://graph.microsoft.com/.default" }; // 根据目标服务调整

// 初始化MSAL客户端
var app = PublicClientApplicationBuilder.Create(clientId)
    .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
    .Build();

// 发起设备代码请求
var result = await app.AcquireTokenWithDeviceCode(scopes, deviceCodeResult =>
{
    // 将此消息记录到日志或通知用户,让用户访问指定URL输入代码完成MFA验证
    Console.WriteLine(deviceCodeResult.Message);
    return Task.CompletedTask;
}).ExecuteAsync();

// 将刷新令牌安全存储(比如Azure Key Vault)
var refreshToken = result.RefreshToken;

// 后续使用刷新令牌获取新访问令牌(无需再次交互)
var refreshResult = await app.AcquireTokenByRefreshToken(scopes, refreshToken).ExecuteAsync();
var accessToken = refreshResult.AccessToken;

注意事项

  • 刷新令牌有有效期(通常为90天),到期后需要重新触发设备代码流程让用户再次授权
  • 需确保Azure AD应用的"公共客户端"选项已启用

方案2:On-Behalf-Of (OBO) 流程 + 托管标识

如果你的场景存在前端/客户端先完成用户MFA登录的环节,可使用OBO流程让Azure Function基于用户已验证的令牌,交换目标服务的访问令牌,全程无交互且保留MFA验证。

代码示例(MSAL.NET)

using Microsoft.Identity.Client;

var clientId = "你的Azure AD应用客户端ID";
var clientSecret = "你的Azure AD应用客户端密钥(或使用证书)";
var tenantId = "你的租户ID";
var userAccessTokenFromFrontend = "前端传入的已完成MFA的用户访问令牌";
var targetScopes = new[] { "https://graph.microsoft.com/.default" };

// 初始化机密客户端
var app = ConfidentialClientApplicationBuilder.Create(clientId)
    .WithClientSecret(clientSecret)
    .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
    .Build();

// 创建用户断言
var userAssertion = new UserAssertion(userAccessTokenFromFrontend);

// 执行OBO流程获取目标服务令牌
var result = await app.AcquireTokenOnBehalfOf(targetScopes, userAssertion).ExecuteAsync();
var targetAccessToken = result.AccessToken;

注意事项

  • 需在Azure AD应用中配置委托权限,并授予管理员同意
  • 前端传入的用户令牌必须包含足够的范围,且未过期

方案3:用户名-证书流(Username-Certificate Flow)

如果你的Azure AD租户允许证书作为强验证方式(可替代MFA),可将用户账户绑定客户端证书,通过证书完成无交互登录。

代码示例(MSAL.NET)

using Microsoft.Identity.Client;
using System.Security.Cryptography.X509Certificates;

var clientId = "你的Azure AD应用客户端ID";
var tenantId = "你的租户ID";
var username = "user@yourdomain.com";
var certPath = "证书文件路径(如.pfx)";
var certPassword = "证书密码";
var scopes = new[] { "https://graph.microsoft.com/.default" };

// 加载证书
var cert = new X509Certificate2(certPath, certPassword);

// 初始化客户端
var app = PublicClientApplicationBuilder.Create(clientId)
    .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
    .Build();

// 通过证书获取令牌
var result = await app.AcquireTokenByUsernameCertificate(scopes, username, cert).ExecuteAsync();
var accessToken = result.AccessToken;

注意事项

  • 需确保租户的MFA策略允许证书作为验证方式
  • 用户账户需提前绑定该客户端证书

内容的提问来源于stack exchange,提问作者dtdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:55:12