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

如何使用ASP.NET MVC从Azure Active Directory获取所有用户邮箱

ASP.NET MVC 从Azure AD获取用户邮箱并在Select2展示

1. 配置Azure AD应用权限

  • 在Azure门户的AD应用注册中,添加应用权限:Directory.Read.All(选择应用权限而非委托权限),并完成管理员同意操作。

2. 安装必要的NuGet包

在NuGet包管理器控制台执行以下命令:

Install-Package Microsoft.Graph
Install-Package Microsoft.Identity.Client

3. 配置Azure AD参数

在项目的Web.config中添加Azure AD相关配置:

<appSettings>
  <add key="AzureAD:TenantId" value="你的租户ID" />
  <add key="AzureAD:ClientId" value="你的客户端ID" />
  <add key="AzureAD:ClientSecret" value="你的客户端密钥" />
</appSettings>

4. 编写控制器逻辑获取用户邮箱

创建控制器实现获取Azure AD用户邮箱的功能:

using Microsoft.Graph;
using Microsoft.Identity.Client;
using System.Configuration;
using System.Threading.Tasks;
using System.Web.Mvc;
using System.Linq;

public class UserController : Controller
{
    public async Task<ActionResult> Index()
    {
        // 读取配置参数
        var tenantId = ConfigurationManager.AppSettings["AzureAD:TenantId"];
        var clientId = ConfigurationManager.AppSettings["AzureAD:ClientId"];
        var clientSecret = ConfigurationManager.AppSettings["AzureAD:ClientSecret"];

        // 获取Graph API访问令牌
        var confidentialClient = ConfidentialClientApplicationBuilder
            .Create(clientId)
            .WithClientSecret(clientSecret)
            .WithTenantId(tenantId)
            .Build();

        var scopes = new[] { "https://graph.microsoft.com/.default" };
        var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();

        // 初始化Graph客户端
        var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) =>
        {
            requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
            return Task.CompletedTask;
        }));

        // 获取存在邮箱的用户数据
        var users = await graphClient.Users
            .Request()
            .Select(u => new { u.Id, u.Mail })
            .Filter("mail ne null")
            .GetAsync();

        // 转换为下拉框可用的选项列表
        var emailOptions = users.Select(u => new SelectListItem
        {
            Value = u.Id,
            Text = u.Mail
        }).ToList();

        ViewBag.EmailOptions = emailOptions;
        return View();
    }
}

5. 前端集成Select2下拉框

在对应的View页面添加下拉框并初始化Select2:

@{
    ViewBag.Title = "用户邮箱选择";
}

<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>

<select id="emailSelect" class="form-control" style="width: 100%;">
    @foreach (var item in ViewBag.EmailOptions as List<SelectListItem>)
    {
        <option value="@item.Value">@item.Text</option>
    }
</select>

<script>
    $(document).ready(function() {
        $('#emailSelect').select2({
            placeholder: "请选择用户邮箱",
            allowClear: true
        });
    });
</script>

注意事项

  • 必须确保Azure AD应用已获得Directory.Read.All权限的管理员同意,否则会触发权限不足的错误。
  • 生产环境建议添加令牌缓存逻辑,减少重复请求Azure AD获取令牌的次数。
  • 若用户数量较多,需处理Graph API的分页返回逻辑,避免数据截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:47:14