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

ASP.NET MVC应用基于ADFS与Azure MFA的AD后台认证方案咨询

解决方案:后台处理ADFS+Azure MFA认证(无页面跳转)

核心思路

要实现无跳转的后台认证,核心是直接调用身份提供商的API完成验证流程,替代传统的重定向模式。以下是两种适配ASP.NET MVC的可行方案:

方案1:调用ADFS的WS-Trust UsernameMixed端点

ADFS原生支持通过SOAP API直接提交用户名密码完成认证,无需跳转至ADFS登录页。步骤如下:

  1. 确保ADFS已启用/adfs/services/trust/13/usernamemixed端点,且你的应用对应的Relying Party Trust允许该认证方式。
  2. 构造符合WS-Trust规范的请求,包含用户名、密码及应用的Relying Party标识符。
  3. 发送请求至ADFS端点,解析返回的SAML断言,在ASP.NET MVC中生成本地认证票据。

简化代码示例:

public async Task<SecurityToken> GetAdfsAuthToken(string username, string password)
{
    var binding = new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential);
    binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;

    var endpoint = new EndpointAddress("https://your-adfs-server/adfs/services/trust/13/usernamemixed");
    var factory = new WSTrustChannelFactory(binding, endpoint)
    {
        TrustVersion = TrustVersion.WSTrust13,
        Credentials = { UserName = { UserName = username, Password = password } }
    };

    var tokenRequest = new RequestSecurityToken
    {
        RequestType = RequestTypes.Issue,
        AppliesTo = new EndpointReference("urn:your-relying-party-id"),
        KeyType = KeyTypes.Bearer
    };

    var channel = factory.CreateChannel();
    return await channel.IssueAsync(tokenRequest);
}

若启用Azure MFA,ADFS会自动触发MFA验证(如短信、验证码推送),此时需额外处理MFA挑战流程——比如解析ADFS返回的挑战响应,在应用内提供验证码输入界面,再提交二次请求完成认证。

方案2:使用Azure AD的ROPC流(资源所有者密码凭证流)

如果你的身份系统已集成Azure AD,可使用ROPC流直接通过API提交用户名密码:

  1. 在Azure AD中注册应用,标记为机密客户端,并启用ROPC流支持。
  2. 向Azure AD令牌端点发送POST请求,携带用户名、密码、应用ID等参数。
  3. 解析返回的ID Token,转换为ASP.NET MVC的本地认证票据。

简化代码示例:

public async Task<string> GetAzureAdIdToken(string username, string password)
{
    using var client = new HttpClient();
    var requestParams = new Dictionary<string, string>
    {
        {"grant_type", "password"},
        {"client_id", "your-app-client-id"},
        {"username", username},
        {"password", password},
        {"scope", "openid profile"},
        {"client_secret", "your-app-client-secret"}
    };

    var content = new FormUrlEncodedContent(requestParams);
    var response = await client.PostAsync("https://login.microsoftonline.com/your-tenant-id/oauth2/v2.0/token", content);
    var responseData = await response.Content.ReadFromJsonAsync<Dictionary<string, string>>();

    return responseData.TryGetValue("id_token", out var token) ? token : string.Empty;
}

注意:ROPC流存在安全风险,仅适用于你完全可控的可信应用;若用户需MFA,请求会返回invalid_grant错误,需引导用户完成MFA验证(比如调用Azure AD的MFA挑战API)。

关键注意事项

  • 安全防护:必须使用HTTPS传输所有认证数据,避免明文泄露;应用内禁止存储用户密码,仅在认证流程中临时使用。
  • MFA适配:两种方案遇到MFA时都需要额外的交互逻辑,需在应用内实现验证码输入、推送确认等界面,后台完成二次验证请求。
  • 票据生成:获取到SAML断言或ID Token后,需手动创建ClaimsIdentity,通过AuthenticationManager.SignIn方法完成用户登录,替代默认的重定向认证流程。
  • 兼容性限制:ADFS的UsernameMixed端点要求ADFS 2.0及以上版本;Azure AD的ROPC流不支持启用了强安全策略(如禁止密码登录)的用户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:57:28