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

Blazor Server如何注册应用与用户双范围的GraphServiceClient

实现应用级权限的GraphServiceClient配置步骤

1. 配置Azure AD应用的应用级权限

  • 登录Azure门户,找到你的应用注册
  • 进入「API权限」,点击「添加权限」→「Microsoft Graph」→「应用权限」
  • 选择所需的应用级权限(如Directory.Read.All、User.Read.All等),点击「添加权限」
  • 点击「授予管理员同意」(应用级权限必须经过租户管理员同意才能生效)

2. 添加应用级配置到appsettings.json

在配置文件中新增独立的应用级认证配置节点,包含租户ID、客户端ID、客户端密钥和Graph权限范围:

"AzureAdApp": {
  "TenantId": "你的租户ID(可为租户域名或GUID)",
  "ClientId": "你的Azure AD应用注册ID",
  "ClientSecret": "你的应用客户端密钥(在「证书和密码」中生成)",
  "GraphScopes": "https://graph.microsoft.com/.default"
}

3. 注册应用级的GraphServiceClient实例

在Program.cs(.NET 6+)或Startup.cs的ConfigureServices方法中,注册一个独立的GraphServiceClient实例,使用客户端凭据流获取应用级令牌:

方式1:使用Keyed Services(.NET 6及以上推荐,避免注入歧义)

using Azure.Identity;
using Microsoft.Graph;

// ...其他服务注册代码

// 注册带键名的应用级Graph客户端,与用户级实例区分
services.AddKeyedSingleton<GraphServiceClient>("AppLevelGraph", sp =>
{
    var config = sp.GetRequiredService<IConfiguration>();
    var appConfig = config.GetSection("AzureAdApp");

    var credential = new ClientSecretCredential(
        appConfig["TenantId"],
        appConfig["ClientId"],
        appConfig["ClientSecret"]);

    return new GraphServiceClient(credential, new[] { appConfig["GraphScopes"] });
});

方式2:使用自定义包装类(兼容.NET 5及更早版本)

如果项目不支持Keyed Services,可通过包装类区分实例:

// 定义应用级Graph客户端包装类
public class AppLevelGraphClientWrapper
{
    public GraphServiceClient Client { get; }

    public AppLevelGraphClientWrapper(GraphServiceClient client)
    {
        Client = client;
    }
}

// 在ConfigureServices中注册包装类
services.AddSingleton<AppLevelGraphClientWrapper>(sp =>
{
    var config = sp.GetRequiredService<IConfiguration>();
    var appConfig = config.GetSection("AzureAdApp");

    var credential = new ClientSecretCredential(
        appConfig["TenantId"],
        appConfig["ClientId"],
        appConfig["ClientSecret"]);

    var graphClient = new GraphServiceClient(credential, new[] { appConfig["GraphScopes"] });
    return new AppLevelGraphClientWrapper(graphClient);
});

4. 在组件中注入使用

Keyed Services方式:

@inject [FromKeyedServices("AppLevelGraph")] GraphServiceClient AppLevelGraphClient

@code {
    protected override async Task OnInitializedAsync()
    {
        // 使用应用级客户端执行Graph查询
        var allUsers = await AppLevelGraphClient.Users.Request().GetAsync();
    }
}

自定义包装类方式:

@inject AppLevelGraphClientWrapper AppLevelGraphWrapper

@code {
    protected override async Task OnInitializedAsync()
    {
        var allUsers = await AppLevelGraphWrapper.Client.Users.Request().GetAsync();
    }
}

注意事项

  • 确保已安装必要的NuGet包:Microsoft.Graph、Azure.Identity
  • 客户端密钥需妥善保管,避免硬编码,建议使用Azure Key Vault存储
  • 应用级权限拥有较高访问权限,需遵循最小权限原则配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:19:01