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

如何在ASP.NET Core MVC应用中通过Azure AD实现自定义登录页鉴权

关于Azure AD自定义登录页与用户名密码验证的问题

首先明确:不推荐也不建议在自定义页面中直接验证Azure AD的用户名和密码,原因和可行方案如下:

为什么不能直接做密码验证?

Azure AD的核心设计基于OAuth2/OpenID Connect协议,默认使用授权码流,依赖微软的登录门户处理身份验证——这是为了保障安全,比如支持多因素认证(MFA)、设备合规检查等。

虽然Azure AD提供了资源所有者密码凭据(ROPC)流,允许通过用户名密码获取令牌,但这个方式有诸多限制和风险:

  • 仅支持工作/学校账户,不兼容个人微软账户
  • 开启了MFA的用户无法通过此方式登录,会直接验证失败
  • 你的应用需要直接处理用户密码,违背了OAuth的安全模型,一旦应用被攻破,用户密码会直接泄露

如果非要用ROPC流(不推荐)

如果你因为特殊场景必须尝试,可使用Microsoft.Identity.Client(MSAL)库实现,通过捕获令牌获取结果来判断验证是否成功:

using Microsoft.Identity.Client;

public async Task<bool> ValidateAzureAdUserCredentials(string username, string password)
{
    var clientId = "你的Azure AD应用客户端ID";
    var tenantId = "你的租户ID";
    // 可根据需求调整权限范围,.default表示应用已配置的所有权限
    var scopes = new[] { "https://graph.microsoft.com/.default" };

    var publicClient = PublicClientApplicationBuilder
        .Create(clientId)
        .WithTenantId(tenantId)
        .Build();

    try
    {
        var authResult = await publicClient.AcquireTokenByUsernamePassword(scopes, username, password)
            .ExecuteAsync();
        
        // 获取到有效令牌则验证成功
        return !string.IsNullOrWhiteSpace(authResult.AccessToken);
    }
    catch (MsalException)
    {
        // 任何验证失败都会抛出异常,比如密码错误、MFA开启、用户不存在等
        return false;
    }
}

推荐的合规方案

正确的做法是使用Azure AD的授权码流,同时自定义登录页的外观:

  • 在Azure AD应用注册的「品牌化体验」中配置自定义登录页面的logo、背景、文字,让登录页与你的应用风格一致
  • 通过OpenID Connect的参数控制登录流程,确保用户始终通过Azure AD的安全页面完成认证,你的应用只处理回调和令牌验证

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:33:25