如何在ASP.NET Core 8 MVC中使用Graph API获取用户头像
如何在ASP.NET Core 8 MVC中使用Graph API获取用户头像
嗨,我来帮你一步步搞定这个需求!你已经完成了Azure AD认证的配置,接下来只需要几个简单步骤就能集成Graph API获取并显示用户的头像了:
1. 安装必要的NuGet包
首先得装上Graph API和身份验证相关的包,打开项目终端,运行这两个命令:
dotnet add package Microsoft.Graph dotnet add package Microsoft.Identity.Web
2. 配置应用设置(appsettings.json)
在你的appsettings.json里,除了已有的Azure AD配置,还要添加Graph API的权限范围:
{ "AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "your-domain.onmicrosoft.com", "TenantId": "your-tenant-id", "ClientId": "your-client-id", "ClientSecret": "your-client-secret", "CallbackPath": "/signin-oidc" }, "GraphScopes": "User.Read" }
注意:这里的GraphScopes用User.Read就足够获取用户头像了,如果需要其他权限可以追加。
3. 在Program.cs中注册Graph服务
把Graph服务注入到依赖容器里,让我们的控制器能调用它。修改Program.cs的认证配置部分:
using Microsoft.Identity.Web; using Microsoft.Identity.Web.UI; var builder = WebApplication.CreateBuilder(args); // 添加Azure AD认证并集成Graph API builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")) .AddMicrosoftGraph(options => { options.Scopes = string.Join(" ", builder.Configuration["GraphScopes"].Split(' ')); }) .AddInMemoryTokenCaches(); // 添加MVC和身份验证UI支持 builder.Services.AddControllersWithViews() .AddMicrosoftIdentityUI(); var app = builder.Build(); // 中间件配置(保持你原有的配置即可) if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
4. 在控制器中调用Graph API获取头像
比如在你的HomeController里,注入GraphServiceClient,然后编写获取头像的逻辑:
using Microsoft.Graph; using Microsoft.AspNetCore.Authorization; using System.IO; public class HomeController : Controller { private readonly GraphServiceClient _graphServiceClient; // 构造函数注入Graph服务 public HomeController(GraphServiceClient graphServiceClient) { _graphServiceClient = graphServiceClient; } [Authorize] // 确保只有认证用户能访问这个Action public async Task<IActionResult> Index() { try { // 获取当前用户的头像流 var photoStream = await _graphServiceClient.Me.Photo.Content.Request().GetAsync(); // 把流转成Base64格式,方便在视图中显示 var memoryStream = new MemoryStream(); await photoStream.CopyToAsync(memoryStream); var base64Photo = Convert.ToBase64String(memoryStream.ToArray()); // 把头像数据传到视图 ViewBag.ProfilePhoto = $"data:image/jpeg;base64,{base64Photo}"; } catch (ServiceException ex) { // 处理异常,比如用户没有上传头像的情况 ViewBag.ProfilePhoto = null; ViewBag.ErrorMessage = ex.Message.Contains("404") ? "No profile photo available" : ex.Message; } return View(); } }
5. 在视图中显示头像
打开对应的视图(比如Index.cshtml或者布局文件_Layout.cshtml),添加显示头像的代码:
@if (!string.IsNullOrEmpty(ViewBag.ProfilePhoto)) { <img src="@ViewBag.ProfilePhoto" alt="User Profile Photo" style="width: 60px; height: 60px; border-radius: 50%; object-fit: cover;" /> } else { <span>@ViewBag.ErrorMessage</span> }
最后一步:配置Azure AD应用权限
别忘了去你的Azure AD应用注册里,确保已经添加了Delegated权限User.Read,并且授予了管理员同意(如果是单租户应用的话)。这样用户登录后,应用才能获取到他们的头像信息。
备注:内容来源于stack exchange,提问作者Thushan Vithana
相关产品推荐
相关产品推荐

