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

使用Microsoft Graph读取固定邮箱:无需用户登录的认证方案咨询(C#)

可行的无交互认证方案(C# + Microsoft Graph)

1. 应用权限模式(Client Credentials Flow)—— 首选方案

这是最适合长期无交互运行的模式,属于服务对服务认证,无需任何用户参与,令牌过期会自动刷新。

配置步骤:

  • 在Azure AD注册应用:
    • 进入Azure门户 → Azure Active Directory → 应用注册 → 新建注册。
    • 转到API权限 → 添加权限 → 选择Microsoft Graph → 应用权限。
    • 添加Mail.Read权限(需写入则加Mail.ReadWrite),点击授予管理员同意(必须由全局管理员或特权角色用户操作)。
    • 转到证书和秘密 → 新建客户端密码(或上传证书,生产环境推荐用证书更安全),保存生成的密钥值(仅显示一次)。

C#代码示例:

using Microsoft.Graph;
using Azure.Identity;

var clientId = "你的应用客户端ID";
var tenantId = "你的租户ID";
var clientSecret = "你的客户端密钥"; // 生产环境建议替换为CertificateCredential

var options = new ClientSecretCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};

var credential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);
var graphClient = new GraphServiceClient(credential);

// 读取目标邮箱的邮件
var messages = await graphClient.Users["target-mailbox@your-domain.com"]
    .Messages
    .Request()
    .Top(10) // 按需调整获取数量
    .GetAsync();

foreach (var message in messages)
{
    Console.WriteLine($"主题: {message.Subject}");
}

注意点:

  • 应用权限是租户级权限,需确保仅访问指定邮箱,避免过度授权。
  • 若使用证书,将ClientSecretCredential替换为CertificateCredential,加载本地证书即可。

2. 托管身份(Managed Identity)—— Azure部署场景首选

如果应用部署在Azure服务(如App Service、Azure VM、Function App)上,托管身份可完全避免管理客户端密钥/证书,由Azure自动维护凭据。

配置步骤:

  • 在Azure服务的身份设置中,启用系统分配或用户分配的托管身份。
  • 给托管身份授予Microsoft Graph的Mail.Read应用权限并完成管理员同意,或直接在目标邮箱的权限设置中添加托管身份的访问权限。

C#代码示例:

using Microsoft.Graph;
using Azure.Identity;

// 自动使用当前Azure服务的托管身份
var credential = new DefaultAzureCredential();
var graphClient = new GraphServiceClient(credential);

// 读取目标邮箱邮件
var messages = await graphClient.Users["target-mailbox@your-domain.com"]
    .Messages
    .Request()
    .GetAsync();

3. Windows服务 + 集成Windows身份(仅限域环境)

如果Windows服务运行在已加入Azure AD或与Azure AD同步的本地AD机器上,且Run As用户为域用户,可使用集成Windows身份认证,但需确保该用户无需MFA(或配置了信任设备/IP的MFA豁免),且有权访问目标邮箱。

配置步骤:

  • 在Azure AD注册应用,添加委托权限Mail.Read并完成管理员同意。
  • 将Windows服务的Run As用户设置为有权访问目标邮箱的域用户。

C#代码示例:

using Microsoft.Graph;
using Azure.Identity;

var clientId = "你的应用客户端ID";
var tenantId = "你的租户ID";

var credential = new IntegratedWindowsCredential(tenantId, clientId);
var graphClient = new GraphServiceClient(credential);

// 读取当前用户邮箱,若访问其他邮箱需添加Mail.Read.Shared权限或目标邮箱共享权限
var messages = await graphClient.Me.Messages.Request().GetAsync();

注意点:

  • 此方案依赖域环境,若用户无法豁免MFA,首次运行仍需交互验证,重启后可能需重新验证,稳定性不如前两个方案。

关于你之前应用密钥失败的问题

大概率是添加了委托权限而非应用权限,或未完成管理员同意。应用权限无需用户上下文,直接以应用身份访问邮箱;委托权限必须绑定用户交互,硬编码密钥无法绕过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:23:10