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

Exchange EWS C#代码401未授权及Azure应用注册受阻求助

问题分析与解决步骤

你的方向完全正确:微软已停止对Exchange Online的基础认证(即用户名密码直接登录),必须改用OAuth 2.0认证。由于管理员禁用了Azure门户的应用注册功能,可通过以下两种替代方式完成应用注册与配置:

方案一:使用PowerShell注册Azure AD应用

  1. 安装并连接Azure AD模块

    • 执行以下命令安装模块(若未安装):
      Install-Module -Name AzureAD -Force -AllowClobber
      
    • 连接到Azure AD:
      Connect-AzureAD
      
      按提示使用管理员账号完成登录。
  2. 注册新应用

    • 创建应用程序:
      $app = New-AzureADApplication -DisplayName "EWS-Mail-Reader" -PublicClient $false -ReplyUrls @("https://localhost")
      
    • 生成客户端密码(仅显示一次,务必保存):
      $passwordCredential = New-AzureADApplicationPasswordCredential -ObjectId $app.ObjectId -CustomKeyIdentifier "EWS-App-Secret" -EndDate (Get-Date).AddYears(1)
      # 保存$passwordCredential.Value作为客户端密码
      
  3. 配置EWS权限

    • 为应用添加Exchange Online的全访问应用权限:
      $exchangeSp = Get-AzureADServicePrincipal -Filter "DisplayName eq 'Office 365 Exchange Online'"
      $ewsPermission = $exchangeSp.AppRoles | Where-Object {$_.Value -eq "full_access_as_app"}
      New-AzureADServiceAppRoleAssignment -ObjectId $app.ObjectId -PrincipalId $app.ObjectId -ResourceId $exchangeSp.ObjectId -Id $ewsPermission.Id
      
  4. 记录关键信息

    • 应用ID:$app.AppId
    • 客户端密码:$passwordCredential.Value
    • 租户ID:(Get-AzureADTenantDetail).ObjectId

方案二:使用Visual Studio注册应用

  1. 配置项目依赖
    右键项目 → 管理NuGet程序包,安装Microsoft.Identity.Client和Microsoft.Exchange.WebServices。

  2. 创建Azure AD应用
    右键项目 → 添加 → 连接服务 → 选择Azure Active Directory → 创建新的Azure AD应用,按向导填写应用名称并选择账户类型(组织内应用选“仅限我的组织目录中的账户”)。

  3. 添加并授予权限
    在Visual Studio的连接服务面板中找到该应用,点击添加权限:

    • 搜索“Exchange”,选择Exchange Web Services
    • 添加full_access_as_app(应用权限,适合服务端无用户交互场景)或EWS.AccessAsUser.All(委派权限,需用户登录)
    • 点击授予管理员同意(需管理员权限)
  4. 提取配置信息
    从项目的appsettings.json或配置文件中获取应用ID、租户ID、客户端密码(机密客户端模式)。

修改C#代码实现OAuth认证

以下是使用客户端凭据流(应用权限)的示例代码:

using Microsoft.Exchange.WebServices.Data;
using Microsoft.Identity.Client;
using System.Threading.Tasks;

class EwsMailReader
{
    static async Task Main(string[] args)
    {
        var tenantId = "你的租户ID";
        var clientId = "你的应用ID";
        var clientSecret = "你的客户端密码";

        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1); // 推荐使用更高版本适配Exchange Online
        service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");

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

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

        service.Credentials = new OAuthCredentials(authResult.AccessToken);

        // 原有邮件读取逻辑保持不变
        PropertySet propSet = new PropertySet(BasePropertySet.FirstClassProperties);
        propSet.Add(ItemSchema.MimeContent);
        propSet.Add(ItemSchema.TextBody);
        
        foreach (EmailMessage email in service.FindItems(WellKnownFolderName.Inbox, new ItemView(10)))
        {
            var message = EmailMessage.Bind(service, email.Id, propSet);
            // 处理邮件内容
        }
    }
}

注意事项

  • 若需模拟特定用户操作,需使用委派权限与授权码流,代码逻辑需调整为引导用户登录获取令牌。
  • 确保应用权限已获得管理员同意,否则会出现权限不足的错误。
  • 针对Exchange Online,建议使用ExchangeVersion.Exchange2013_SP1或更高版本以获得更好兼容性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:35:13