如何使用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
相关产品推荐
相关产品推荐

