我来为你创建一个 .NET Core 应用程序,用于向世纪互联 SharePoint Online 上传文件。现在让我为你创建配套的项目文件和详细的配置说明:我为你创建了一个完整的 .NET Core 解决方案,用于向世纪互联 SharePoint Online 上传文件。这个解决方案包含以下关键特性:
🎯 核心功能
文件上传
- 智能上传:自动选择小文件直传或大文件分片上传
- 进度显示:大文件上传实时进度反馈
- 错误处理:完善的异常捕获和用户友好提示
文件管理
- 列出文件夹内容
- 创建和删除文件夹
- 删除文件(带确认机制)
🔧 技术特点
世纪互联适配
- 使用正确的中国版端点(
login.chinacloudapi.cn
) - Graph API 中国版 URL(
microsoftgraph.chinacloudapi.cn
) - 客户端凭据认证流程
现代化开发
- .NET 6.0 框架
- 异步编程模式
- 配置文件分离
- 交互式命令行界面
🚀 快速开始
- 创建项目:
dotnet new console -n SharePointChinaUpload
cd SharePointChinaUpload
- 添加NuGet包:
dotnet add package Microsoft.Graph
dotnet add package Microsoft.Graph.Auth
dotnet add package Microsoft.Identity.Client
- 配置 Azure AD 应用:
- 在 Azure 中国门户创建应用注册
- 配置 API 权限:
Sites.ReadWrite.All
,Files.ReadWrite.All
- 生成客户端密钥
- 填写配置: 程序首次运行会自动生成
appsettings.json
模板 - 运行程序:
dotnet run
💡 使用建议
- 安全性:生产环境建议使用 Azure Key Vault 存储敏感信息
- 性能:大文件上传建议在稳定网络环境下进行
- 权限:根据实际需要配置最小权限原则
- 监控:可以集成日志记录和监控功能
这个解决方案适合企业内部文件管理、自动化文档归档、批量文件上传等场景。如果你需要特定的功能扩展或有其他技术问题,请告诉我!
核心代码如下:
using Microsoft.Graph;
using Microsoft.Graph.Auth;
using Microsoft.Identity.Client;
using System;
using System.IO;
using System.Threading.Tasks;
using System.Text.Json;
namespace SharePointChinaUpload
{
// 配置类
public class AppConfig
{
public string ClientId { get; set; }
public string ClientSecret { get; set; }
public string TenantId { get; set; }
public string SiteId { get; set; }
public string DriveId { get; set; }
public string FolderPath { get; set; } = "/"; // 默认根目录
}
// SharePoint 上传服务
public class SharePointUploadService
{
private readonly AppConfig _config;
private readonly GraphServiceClient _graphClient;
public SharePointUploadService(AppConfig config)
{
_config = config;
_graphClient = CreateGraphClient();
}
// 创建 Graph 客户端(世纪互联版本)
private GraphServiceClient CreateGraphClient()
{
// 世纪互联特定的认证端点
var app = ConfidentialClientApplicationBuilder
.Create(_config.ClientId)
.WithClientSecret(_config.ClientSecret)
.WithAuthority($"https://login.chinacloudapi.cn/{_config.TenantId}")
.Build();
// 创建认证提供程序
var authProvider = new ClientCredentialProvider(app);
// 使用世纪互联的 Graph 端点
var graphClient = new GraphServiceClient(
"https://microsoftgraph.chinacloudapi.cn/v1.0",
authProvider);
return graphClient;
}
// 上传小文件(< 4MB)
public async Task<DriveItem> UploadSmallFileAsync(string localFilePath, string fileName = null)
{
try
{
if (!File.Exists(localFilePath))
throw new FileNotFoundException($"文件不存在: {localFilePath}");
fileName = fileName ?? Path.GetFileName(localFilePath);
var fileStream = File.OpenRead(localFilePath);
// 构建上传路径
var uploadPath = Path.Combine(_config.FolderPath, fileName).Replace("\\", "/");
Console.WriteLine($"正在上传文件: {fileName}");
Console.WriteLine($"上传路径: {uploadPath}");
// 上传文件
var uploadedFile = await _graphClient
.Sites[_config.SiteId]
.Drives[_config.DriveId]
.Root
.ItemWithPath(uploadPath)
.Content
.Request()
.PutAsync<DriveItem>(fileStream);
Console.WriteLine($"文件上传成功!");
Console.WriteLine($"文件ID: {uploadedFile.Id}");
Console.WriteLine($"文件URL: {uploadedFile.WebUrl}");
return uploadedFile;
}
catch (Exception ex)
{
Console.WriteLine($"文件上传失败: {ex.Message}");
throw;
}
}
// 上传大文件(>= 4MB)使用分片上传
public async Task<DriveItem> UploadLargeFileAsync(string localFilePath, string fileName = null)
{
try
{
if (!File.Exists(localFilePath))
throw new FileNotFoundException($"文件不存在: {localFilePath}");
var fileInfo = new FileInfo(localFilePath);
fileName = fileName ?? fileInfo.Name;
Console.WriteLine($"正在上传大文件: {fileName} (大小: {fileInfo.Length / (1024 * 1024):F2} MB)");
// 构建上传路径
var uploadPath = Path.Combine(_config.FolderPath, fileName).Replace("\\", "/");
// 创建上传会话
var uploadSession = await _graphClient
.Sites[_config.SiteId]
.Drives[_config.DriveId]
.Root
.ItemWithPath(uploadPath)
.CreateUploadSession()
.Request()
.PostAsync();
Console.WriteLine("创建上传会话成功");
// 分片上传
var maxChunkSize = 320 * 1024; // 320KB 块大小
var provider = new ChunkedUploadProvider(uploadSession, _graphClient, File.OpenRead(localFilePath), maxChunkSize);
var chunkRequests = provider.GetUploadChunkRequests();
var readBuffer = new byte[maxChunkSize];
var trackedExceptions = new List<Exception>();
DriveItem itemResult = null;
// 上传每个块
foreach (var request in chunkRequests)
{
var result = await provider.GetChunkRequestResponseAsync(request, readBuffer, trackedExceptions);
if (result.UploadSucceeded)
{
itemResult = result.ItemResponse;
break;
}
// 显示进度
var progress = (double)request.RangeBegin / fileInfo.Length * 100;
Console.WriteLine($"上传进度: {progress:F1}%");
}
if (itemResult != null)
{
Console.WriteLine($"大文件上传成功!");
Console.WriteLine($"文件ID: {itemResult.Id}");
Console.WriteLine($"文件URL: {itemResult.WebUrl}");
}
return itemResult;
}
catch (Exception ex)
{
Console.WriteLine($"大文件上传失败: {ex.Message}");
throw;
}
}
// 智能上传(自动选择小文件或大文件上传方式)
public async Task<DriveItem> UploadFileAsync(string localFilePath, string fileName = null)
{
var fileInfo = new FileInfo(localFilePath);
const long largeFileThreshold = 4 * 1024 * 1024; // 4MB
if (fileInfo.Length < largeFileThreshold)
{
return await UploadSmallFileAsync(localFilePath, fileName);
}
else
{
return await UploadLargeFileAsync(localFilePath, fileName);
}
}
// 列出文件夹内容
public async Task ListFolderContentsAsync(string folderPath = null)
{
try
{
folderPath = folderPath ?? _config.FolderPath;
var items = await _graphClient
.Sites[_config.SiteId]
.Drives[_config.DriveId]
.Root
.ItemWithPath(folderPath)
.Children
.Request()
.GetAsync();
Console.WriteLine($"\n文件夹内容 ({folderPath}):");
Console.WriteLine(new string('-', 60));
foreach (var item in items)
{
var type = item.Folder != null ? "文件夹" : "文件";
var size = item.Size.HasValue ? $"{item.Size / 1024:N0} KB" : "";
var modified = item.LastModifiedDateTime?.ToString("yyyy-MM-dd HH:mm");
Console.WriteLine($"{type,-6} | {item.Name,-30} | {size,-10} | {modified}");
}
}
catch (Exception ex)
{
Console.WriteLine($"列出文件夹内容失败: {ex.Message}");
}
}
// 创建文件夹
public async Task<DriveItem> CreateFolderAsync(string folderName, string parentPath = null)
{
try
{
parentPath = parentPath ?? _config.FolderPath;
var driveItem = new DriveItem
{
Name = folderName,
Folder = new Folder { }
};
var newFolder = await _graphClient
.Sites[_config.SiteId]
.Drives[_config.DriveId]
.Root
.ItemWithPath(parentPath)
.Children
.Request()
.AddAsync(driveItem);
Console.WriteLine($"文件夹创建成功: {newFolder.Name}");
return newFolder;
}
catch (Exception ex)
{
Console.WriteLine($"创建文件夹失败: {ex.Message}");
throw;
}
}
// 删除文件或文件夹
public async Task DeleteItemAsync(string itemPath)
{
try
{
await _graphClient
.Sites[_config.SiteId]
.Drives[_config.DriveId]
.Root
.ItemWithPath(itemPath)
.Request()
.DeleteAsync();
Console.WriteLine($"删除成功: {itemPath}");
}
catch (Exception ex)
{
Console.WriteLine($"删除失败: {ex.Message}");
throw;
}
}
}
// 主程序类
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("=== .NET Core 世纪互联 SharePoint 文件上传工具 ===\n");
try
{
// 从配置文件加载配置
var config = LoadConfiguration();
// 创建 SharePoint 服务
var sharePointService = new SharePointUploadService(config);
// 显示菜单
await ShowMenu(sharePointService);
}
catch (Exception ex)
{
Console.WriteLine($"程序运行出错: {ex.Message}");
Console.WriteLine($"详细错误: {ex}");
}
Console.WriteLine("\n按任意键退出...");
Console.ReadKey();
}
// 加载配置
private static AppConfig LoadConfiguration()
{
var configPath = "appsettings.json";
if (!File.Exists(configPath))
{
// 创建示例配置文件
var exampleConfig = new AppConfig
{
ClientId = "your-client-id-here",
ClientSecret = "your-client-secret-here",
TenantId = "your-tenant-id-here",
SiteId = "your-site-id-here",
DriveId = "your-drive-id-here",
FolderPath = "/Documents"
};
var exampleJson = JsonSerializer.Serialize(exampleConfig, new JsonSerializerOptions
{
WriteIndented = true
});
File.WriteAllText(configPath, exampleJson);
Console.WriteLine($"已创建示例配置文件: {configPath}");
Console.WriteLine("请填写正确的配置信息后重新运行程序。");
throw new InvalidOperationException("配置文件不存在,已创建示例文件。");
}
var configJson = File.ReadAllText(configPath);
var config = JsonSerializer.Deserialize<AppConfig>(configJson);
// 验证必需的配置
if (string.IsNullOrEmpty(config.ClientId) || config.ClientId == "your-client-id-here")
throw new InvalidOperationException("请在配置文件中设置正确的 ClientId");
return config;
}
// 显示交互菜单
private static async Task ShowMenu(SharePointUploadService service)
{
while (true)
{
Console.WriteLine("\n请选择操作:");
Console.WriteLine("1. 上传文件");
Console.WriteLine("2. 列出文件夹内容");
Console.WriteLine("3. 创建文件夹");
Console.WriteLine("4. 删除文件/文件夹");
Console.WriteLine("5. 退出");
Console.Write("\n请输入选项 (1-5): ");
var choice = Console.ReadLine();
try
{
switch (choice)
{
case "1":
await HandleUploadFile(service);
break;
case "2":
await HandleListFolder(service);
break;
case "3":
await HandleCreateFolder(service);
break;
case "4":
await HandleDeleteItem(service);
break;
case "5":
return;
default:
Console.WriteLine("无效选项,请重新选择。");
break;
}
}
catch (Exception ex)
{
Console.WriteLine($"操作失败: {ex.Message}");
}
}
}
private static async Task HandleUploadFile(SharePointUploadService service)
{
Console.Write("请输入要上传的文件路径: ");
var filePath = Console.ReadLine()?.Trim('"');
if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath))
{
Console.WriteLine("文件路径无效或文件不存在。");
return;
}
Console.Write("请输入目标文件名(留空使用原文件名): ");
var targetName = Console.ReadLine();
targetName = string.IsNullOrWhiteSpace(targetName) ? null : targetName;
await service.UploadFileAsync(filePath, targetName);
}
private static async Task HandleListFolder(SharePointUploadService service)
{
Console.Write("请输入文件夹路径(留空使用默认路径): ");
var folderPath = Console.ReadLine();
folderPath = string.IsNullOrWhiteSpace(folderPath) ? null : folderPath;
await service.ListFolderContentsAsync(folderPath);
}
private static async Task HandleCreateFolder(SharePointUploadService service)
{
Console.Write("请输入新文件夹名称: ");
var folderName = Console.ReadLine();
if (string.IsNullOrWhiteSpace(folderName))
{
Console.WriteLine("文件夹名称不能为空。");
return;
}
Console.Write("请输入父文件夹路径(留空使用默认路径): ");
var parentPath = Console.ReadLine();
parentPath = string.IsNullOrWhiteSpace(parentPath) ? null : parentPath;
await service.CreateFolderAsync(folderName, parentPath);
}
private static async Task HandleDeleteItem(SharePointUploadService service)
{
Console.Write("请输入要删除的文件/文件夹路径: ");
var itemPath = Console.ReadLine();
if (string.IsNullOrWhiteSpace(itemPath))
{
Console.WriteLine("路径不能为空。");
return;
}
Console.Write($"确认要删除 '{itemPath}' 吗? (y/N): ");
var confirm = Console.ReadLine();
if (confirm?.ToLower() == "y" || confirm?.ToLower() == "yes")
{
await service.DeleteItemAsync(itemPath);
}
else
{
Console.WriteLine("操作已取消。");
}
}
}
}
来一个.NET 8的
核心依赖包及版本
必需的 NuGet 包
<ItemGroup>
<PackageReference Include="Microsoft.Graph" Version="5.36.0" />
<PackageReference Include="Azure.Identity" Version="1.10.4" />
<PackageReference Include="System.Text.Json" Version="7.0.3" />
</ItemGroup>
版本说明
- Microsoft.Graph 5.36.0
- 最新的 Microsoft Graph SDK
- 支持世纪互联环境
- API 结构与旧版本(4.x)有重大变化
- Azure.Identity 1.10.4
- 替代已废弃的
Microsoft.Graph.Auth
- 提供现代化的身份验证方式
- 支持多种认证凭据类型
- 替代已废弃的
- System.Text.Json 7.0.3
- 用于配置文件的序列化/反序列化
- 处理 JSON 响应数据
⚠️ 不要使用的包(已废弃)
<!-- 以下包已过时,不要使用 -->
<PackageReference Include="Microsoft.Graph.Auth" Version="1.0.0-preview.7" />
<PackageReference Include="Microsoft.Identity.Client" Version="4.x" />
世纪互联特定配置
关键端点
// 认证端点
AuthorityHost = new Uri("https://login.chinacloudapi.cn")
// Graph API 端点
BaseUrl = "https://microsoftgraph.chinacloudapi.cn/v1.0"
// OAuth Scope
Scope = "https://microsoftgraph.chinacloudapi.cn/.default"
身份验证代码
// 创建客户端凭据(推荐方式)
var options = new ClientSecretCredentialOptions
{
AuthorityHost = new Uri("https://login.chinacloudapi.cn")
};
var credential = new ClientSecretCredential(
tenantId,
clientId,
clientSecret,
options
);
var graphClient = new GraphServiceClient(
credential,
new[] { "https://microsoftgraph.chinacloudapi.cn/.default" }
);
graphClient.RequestAdapter.BaseUrl = "https://microsoftgraph.chinacloudapi.cn/v1.0";
API 调用方式变化
旧版本 (4.x) – 已废弃
// ❌ 不再支持
await graphClient.Sites[siteId]
.Drives[driveId]
.Root
.ItemWithPath(path)
.Content
.Request()
.PutAsync(stream);
新版本 (5.x) – 正确方式
// ✅ 正确的访问方式
await graphClient.Drives[driveId]
.Items["root"]
.ItemWithPath(path)
.Content
.PutAsync(stream);
关键变化点
- 移除了
.Root
属性,改用.Items["root"]
- 移除了
.Request()
,直接调用操作方法 - 简化了 API 调用链
Azure AD 应用注册配置
必需的 API 权限(应用程序权限)
Sites.ReadWrite.All
Files.ReadWrite.All
配置文件示例
{
"ClientId": "你的应用ID",
"ClientSecret": "你的客户端密钥",
"TenantId": "你的租户ID",
"SiteId": "SharePoint站点ID",
"DriveId": "文档库驱动器ID",
"FolderPath": "/Documents"
}
功能实现
小文件上传(< 4MB)
var uploadedFile = await graphClient.Drives[driveId]
.Items["root"]
.ItemWithPath(uploadPath)
.Content
.PutAsync(fileStream);
大文件分片上传(>= 4MB)
// 1. 创建上传会话
var uploadSession = await graphClient.Drives[driveId]
.Items["root"]
.ItemWithPath(uploadPath)
.CreateUploadSession
.PostAsync(requestBody);
// 2. 分片上传
// 使用 HttpClient 发送 PUT 请求到 uploadSession.UploadUrl
文件夹操作
// 列出内容
var items = await graphClient.Drives[driveId]
.Items["root"]
.ItemWithPath(folderPath)
.Children
.GetAsync();
// 创建文件夹
var newFolder = await graphClient.Drives[driveId]
.Items["root"]
.ItemWithPath(parentPath)
.Children
.PostAsync(driveItem);
// 删除项目
await graphClient.Drives[driveId]
.Items["root"]
.ItemWithPath(itemPath)
.DeleteAsync();
常见问题及解决方案
1. 编译错误:找不到 Root 定义
问题:DriveItemRequestBuilder"未包含"Root"的定义
解决:使用 .Items["root"]
替代 .Root
2. 认证错误
问题:AADSTS70011: scope is not valid
解决:确保使用世纪互联端点和正确的 scope
3. 权限不足
问题:Forbidden - Insufficient privileges
解决:
- 检查 API 权限配置
- 确认已授予管理员同意
- 验证使用应用程序权限而非委托权限
项目结构
SharePointChinaUpload/
├── SharePointChinaUpload.csproj
├── Program.cs
├── appsettings.json
└── README.md
完整项目文件
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Graph" Version="5.36.0" />
<PackageReference Include="Azure.Identity" Version="1.10.4" />
<PackageReference Include="System.Text.Json" Version="7.0.3" />
</ItemGroup>
</Project>
安装和运行
# 1. 创建项目
dotnet new console -n SharePointChinaUpload
# 2. 添加依赖
dotnet add package Microsoft.Graph --version 5.36.0
dotnet add package Azure.Identity --version 1.10.4
dotnet add package System.Text.Json --version 7.0.3
# 3. 还原依赖
dotnet restore
# 4. 运行
dotnet run
安全建议
- 不要将敏感信息提交到版本控制
- 使用
.gitignore
排除appsettings.json
- 生产环境使用 Azure Key Vault
- 使用
- 定期轮换客户端密钥
- 设置密钥过期时间
- 建立密钥轮换流程
- 最小权限原则
- 只授予必要的 API 权限
- 考虑使用委托权限替代应用权限
参考资源
总结
使用 .NET Core 对接世纪互联 SharePoint 的关键点:
- 使用 Microsoft.Graph 5.x 和 Azure.Identity 替代旧版认证包
- 配置正确的世纪互联端点
- 使用
.Items["root"]
而不是.Root
- 正确配置 Azure AD 应用权限
- 注意 API 调用方式的变化
本文提供的完整代码已在世纪互联环境下测试通过,适用于企业内部文档管理、自动化归档等场景。
完整代码:
using Microsoft.Graph;
using Microsoft.Graph.Models;
using Azure.Identity;
using System;
using System.IO;
using System.Threading.Tasks;
using System.Text.Json;
using System.Collections.Generic;
namespace SharePointChinaUpload
{
// 配置类
public class AppConfig
{
public string ClientId { get; set; } = string.Empty;
public string ClientSecret { get; set; } = string.Empty;
public string TenantId { get; set; } = string.Empty;
public string SiteId { get; set; } = string.Empty;
public string DriveId { get; set; } = string.Empty;
public string FolderPath { get; set; } = "/";
}
// SharePoint 上传服务
public class SharePointUploadService
{
private readonly AppConfig _config;
private readonly GraphServiceClient _graphClient;
public SharePointUploadService(AppConfig config)
{
_config = config;
_graphClient = CreateGraphClient();
}
// 创建 Graph 客户端(世纪互联版本)
private GraphServiceClient CreateGraphClient()
{
var options = new ClientSecretCredentialOptions
{
AuthorityHost = new Uri("https://login.chinacloudapi.cn")
};
var credential = new ClientSecretCredential(
_config.TenantId,
_config.ClientId,
_config.ClientSecret,
options
);
var graphClient = new GraphServiceClient(
credential,
new[] { "https://microsoftgraph.chinacloudapi.cn/.default" }
);
graphClient.RequestAdapter.BaseUrl = "https://microsoftgraph.chinacloudapi.cn/v1.0";
return graphClient;
}
// 上传小文件(< 4MB)
public async Task<DriveItem> UploadSmallFileAsync(string localFilePath, string? fileName = null)
{
try
{
if (!File.Exists(localFilePath))
throw new FileNotFoundException($"文件不存在: {localFilePath}");
fileName = fileName ?? Path.GetFileName(localFilePath);
using var fileStream = File.OpenRead(localFilePath);
// 构建上传路径
var uploadPath = Path.Combine(_config.FolderPath, fileName).Replace("\\", "/");
Console.WriteLine($"正在上传文件: {fileName}");
Console.WriteLine($"上传路径: {uploadPath}");
// 修正后的访问方式
var uploadedFile = await _graphClient.Drives[_config.DriveId]
.Items["root"]
.ItemWithPath(uploadPath)
.Content
.PutAsync(fileStream);
Console.WriteLine($"文件上传成功!");
Console.WriteLine($"文件ID: {uploadedFile?.Id}");
Console.WriteLine($"文件URL: {uploadedFile?.WebUrl}");
return uploadedFile!;
}
catch (Exception ex)
{
Console.WriteLine($"文件上传失败: {ex.Message}");
throw;
}
}
// 上传大文件(>= 4MB)使用分片上传
public async Task<DriveItem?> UploadLargeFileAsync(string localFilePath, string? fileName = null)
{
try
{
if (!File.Exists(localFilePath))
throw new FileNotFoundException($"文件不存在: {localFilePath}");
var fileInfo = new FileInfo(localFilePath);
fileName = fileName ?? fileInfo.Name;
Console.WriteLine($"正在上传大文件: {fileName} (大小: {fileInfo.Length / (1024.0 * 1024.0):F2} MB)");
var uploadPath = Path.Combine(_config.FolderPath, fileName).Replace("\\", "/");
var uploadSessionRequestBody = new Microsoft.Graph.Drives.Item.Items.Item.CreateUploadSession.CreateUploadSessionPostRequestBody
{
Item = new DriveItemUploadableProperties
{
AdditionalData = new Dictionary<string, object>
{
{ "@microsoft.graph.conflictBehavior", "rename" }
}
}
};
// 修正后的访问方式
var uploadSession = await _graphClient.Drives[_config.DriveId]
.Items["root"]
.ItemWithPath(uploadPath)
.CreateUploadSession
.PostAsync(uploadSessionRequestBody);
if (uploadSession?.UploadUrl == null)
{
throw new Exception("创建上传会话失败");
}
Console.WriteLine("创建上传会话成功");
const int maxChunkSize = 320 * 1024 * 10; // 3.2MB
using var fileStream = File.OpenRead(localFilePath);
var buffer = new byte[maxChunkSize];
long totalBytesRead = 0;
int bytesRead;
DriveItem? result = null;
using var httpClient = new HttpClient();
while ((bytesRead = await fileStream.ReadAsync(buffer, 0, maxChunkSize)) > 0)
{
var chunkData = new byte[bytesRead];
Array.Copy(buffer, chunkData, bytesRead);
var rangeHeader = $"bytes {totalBytesRead}-{totalBytesRead + bytesRead - 1}/{fileInfo.Length}";
using var content = new ByteArrayContent(chunkData);
content.Headers.Add("Content-Range", rangeHeader);
content.Headers.Add("Content-Length", bytesRead.ToString());
var response = await httpClient.PutAsync(uploadSession.UploadUrl, content);
var responseContent = await response.Content.ReadAsStringAsync();
totalBytesRead += bytesRead;
var progress = (double)totalBytesRead / fileInfo.Length * 100;
Console.WriteLine($"上传进度: {progress:F1}%");
if (response.IsSuccessStatusCode && progress >= 99.9)
{
result = JsonSerializer.Deserialize<DriveItem>(responseContent);
}
}
if (result != null)
{
Console.WriteLine($"大文件上传成功!");
Console.WriteLine($"文件ID: {result.Id}");
Console.WriteLine($"文件URL: {result.WebUrl}");
}
return result;
}
catch (Exception ex)
{
Console.WriteLine($"大文件上传失败: {ex.Message}");
throw;
}
}
// 智能上传
public async Task<DriveItem?> UploadFileAsync(string localFilePath, string? fileName = null)
{
var fileInfo = new FileInfo(localFilePath);
const long largeFileThreshold = 4 * 1024 * 1024;
if (fileInfo.Length < largeFileThreshold)
{
return await UploadSmallFileAsync(localFilePath, fileName);
}
else
{
return await UploadLargeFileAsync(localFilePath, fileName);
}
}
// 列出文件夹内容
public async Task ListFolderContentsAsync(string? folderPath = null)
{
try
{
folderPath = folderPath ?? _config.FolderPath;
// 修正后的访问方式
var items = await _graphClient.Drives[_config.DriveId]
.Items["root"]
.ItemWithPath(folderPath)
.Children
.GetAsync();
Console.WriteLine($"\n文件夹内容 ({folderPath}):");
Console.WriteLine(new string('-', 80));
if (items?.Value != null)
{
foreach (var item in items.Value)
{
var type = item.Folder != null ? "文件夹" : "文件";
var size = item.Size.HasValue ? $"{item.Size / 1024:N0} KB" : "";
var modified = item.LastModifiedDateTime?.ToString("yyyy-MM-dd HH:mm");
Console.WriteLine($"{type,-6} | {item.Name,-40} | {size,-12} | {modified}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"列出文件夹内容失败: {ex.Message}");
}
}
// 创建文件夹
public async Task<DriveItem?> CreateFolderAsync(string folderName, string? parentPath = null)
{
try
{
parentPath = parentPath ?? _config.FolderPath;
var driveItem = new DriveItem
{
Name = folderName,
Folder = new Folder(),
AdditionalData = new Dictionary<string, object>
{
{ "@microsoft.graph.conflictBehavior", "rename" }
}
};
// 修正后的访问方式
var newFolder = await _graphClient.Drives[_config.DriveId]
.Items["root"]
.ItemWithPath(parentPath)
.Children
.PostAsync(driveItem);
Console.WriteLine($"文件夹创建成功: {newFolder?.Name}");
return newFolder;
}
catch (Exception ex)
{
Console.WriteLine($"创建文件夹失败: {ex.Message}");
throw;
}
}
// 删除文件或文件夹
public async Task DeleteItemAsync(string itemPath)
{
try
{
// 修正后的访问方式
await _graphClient.Drives[_config.DriveId]
.Items["root"]
.ItemWithPath(itemPath)
.DeleteAsync();
Console.WriteLine($"删除成功: {itemPath}");
}
catch (Exception ex)
{
Console.WriteLine($"删除失败: {ex.Message}");
throw;
}
}
}
// 主程序类
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("=== .NET Core 世纪互联 SharePoint 文件上传工具 ===\n");
try
{
var config = LoadConfiguration();
var sharePointService = new SharePointUploadService(config);
await ShowMenu(sharePointService);
}
catch (Exception ex)
{
Console.WriteLine($"程序运行出错: {ex.Message}");
Console.WriteLine($"详细错误: {ex}");
}
Console.WriteLine("\n按任意键退出...");
Console.ReadKey();
}
private static AppConfig LoadConfiguration()
{
var configPath = "appsettings.json";
if (!File.Exists(configPath))
{
var exampleConfig = new AppConfig
{
ClientId = "your-client-id-here",
ClientSecret = "your-client-secret-here",
TenantId = "your-tenant-id-here",
SiteId = "your-site-id-here",
DriveId = "your-drive-id-here",
FolderPath = "/Documents"
};
var exampleJson = JsonSerializer.Serialize(exampleConfig, new JsonSerializerOptions
{
WriteIndented = true
});
File.WriteAllText(configPath, exampleJson);
Console.WriteLine($"已创建示例配置文件: {configPath}");
Console.WriteLine("请填写正确的配置信息后重新运行程序。");
throw new InvalidOperationException("配置文件不存在,已创建示例文件。");
}
var configJson = File.ReadAllText(configPath);
var config = JsonSerializer.Deserialize<AppConfig>(configJson);
if (config == null || string.IsNullOrEmpty(config.ClientId) || config.ClientId == "your-client-id-here")
throw new InvalidOperationException("请在配置文件中设置正确的 ClientId");
return config;
}
private static async Task ShowMenu(SharePointUploadService service)
{
while (true)
{
Console.WriteLine("\n请选择操作:");
Console.WriteLine("1. 上传文件");
Console.WriteLine("2. 列出文件夹内容");
Console.WriteLine("3. 创建文件夹");
Console.WriteLine("4. 删除文件/文件夹");
Console.WriteLine("5. 退出");
Console.Write("\n请输入选项 (1-5): ");
var choice = Console.ReadLine();
try
{
switch (choice)
{
case "1":
await HandleUploadFile(service);
break;
case "2":
await HandleListFolder(service);
break;
case "3":
await HandleCreateFolder(service);
break;
case "4":
await HandleDeleteItem(service);
break;
case "5":
return;
default:
Console.WriteLine("无效选项,请重新选择。");
break;
}
}
catch (Exception ex)
{
Console.WriteLine($"操作失败: {ex.Message}");
}
}
}
private static async Task HandleUploadFile(SharePointUploadService service)
{
Console.Write("请输入要上传的文件路径: ");
var filePath = Console.ReadLine()?.Trim('"');
if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath))
{
Console.WriteLine("文件路径无效或文件不存在。");
return;
}
Console.Write("请输入目标文件名(留空使用原文件名): ");
var targetName = Console.ReadLine();
targetName = string.IsNullOrWhiteSpace(targetName) ? null : targetName;
await service.UploadFileAsync(filePath, targetName);
}
private static async Task HandleListFolder(SharePointUploadService service)
{
Console.Write("请输入文件夹路径(留空使用默认路径): ");
var folderPath = Console.ReadLine();
folderPath = string.IsNullOrWhiteSpace(folderPath) ? null : folderPath;
await service.ListFolderContentsAsync(folderPath);
}
private static async Task HandleCreateFolder(SharePointUploadService service)
{
Console.Write("请输入新文件夹名称: ");
var folderName = Console.ReadLine();
if (string.IsNullOrWhiteSpace(folderName))
{
Console.WriteLine("文件夹名称不能为空。");
return;
}
Console.Write("请输入父文件夹路径(留空使用默认路径): ");
var parentPath = Console.ReadLine();
parentPath = string.IsNullOrWhiteSpace(parentPath) ? null : parentPath;
await service.CreateFolderAsync(folderName, parentPath);
}
private static async Task HandleDeleteItem(SharePointUploadService service)
{
Console.Write("请输入要删除的文件/文件夹路径: ");
var itemPath = Console.ReadLine();
if (string.IsNullOrWhiteSpace(itemPath))
{
Console.WriteLine("路径不能为空。");
return;
}
Console.Write($"确认要删除 '{itemPath}' 吗? (y/N): ");
var confirm = Console.ReadLine();
if (confirm?.ToLower() == "y" || confirm?.ToLower() == "yes")
{
await service.DeleteItemAsync(itemPath);
}
else
{
Console.WriteLine("操作已取消。");
}
}
}
}
官方的接口文档:使用 Microsoft Graph 中的 SharePoint 网站 – Microsoft Graph v1.0 | Microsoft Learn
注意,这里面不能像一样一样去看站点一块的,如果你想操作文件要看:
更新文件或文件夹 – Microsoft Graph v1.0 | Microsoft Learn
如果有报错:查看下报错码:
Microsoft Entra 身份验证和授权错误代码 – Microsoft identity platform | Microsoft Learn
错误 | 说明 |
---|---|
AADSTS16000 | InteractionRequired – 来自标识提供者“{idp}”的用户帐户“{EmailHidden}”在租户“{tenant}”中不存在,且无法访问该租户中的应用程序 ‘{appid}'({appName})。 该帐户需要先作为外部用户添加到租户中。 注销并使用另一 Microsoft Entra 用户帐户再次登录。 当你尝试使用个人 Microsoft 帐户登录到 Microsoft Entra 管理中心,但没有与之关联的目录时,此错误相当常见。 |
AADSTS16001 | UserAccountSelectionInvalid – 如果用户选择会话选择逻辑已拒绝的某个磁贴,你将看到此错误。 触发此错误时,用户可以从更新的磁贴/会话列表中进行选择或选择另一个帐户进行恢复。 此错误的原因可能是代码缺陷或出现争用状况。 |
AADSTS16002 | AppSessionSelectionInvalid – 不符合应用指定的 SID 要求。 |
AADSTS160021 | AppSessionSelectionInvalidSessionNotExist – 应用程序请求的用户会话不存在。 此问题可以通过创建新的 Azure 帐户来得到解决。 |
AADSTS16003 | SsoUserAccountNotFoundInResourceTenant – 指示尚未显式将用户添加到租户。 |
AADSTS17003 | CredentialKeyProvisioningFailed – Microsoft Entra ID 无法预配用户密钥。 |
AADSTS20001 | WsFedSignInResponseError – 联合标识提供者出现问题。 请联系 IDP 解决此问题。 |
AADSTS20012 | WsFedMessageInvalid – 联合标识提供者出现问题。 请联系 IDP 解决此问题。 |
AADSTS20033 | FedMetadataInvalidTenantName – 联合标识提供者出现问题。 请联系 IDP 解决此问题。 |
AADSTS230109 | CachedCredentialNonGWAuthNRequestsNotSupported – 备份身份验证服务仅允许来自 Microsoft Entra 网关的 AuthN 请求。 当流量直接面向备份身份验证服务而不是通过反向代理时,将返回此错误。 |
AADSTS28002 | 请求访问令牌时,为输入参数范围“{scope}”提供的值无效。 请指定有效范围。 |
AADSTS28003 | 当使用提供的授权代码请求访问令牌时,为输入参数范围提供的值不能为空。 请指定有效范围。 |
AADSTS399284 | InboundIdTokenIssuerInvalid – 联合身份验证中收到的入站 ID 令牌颁发者无效。 要么为空,要么与领域标识符不匹配。 |
AADSTS40008 | OAuth2IdPUnretryableServerError – 联合标识提供者出现问题。 请联系 IDP 解决此问题。 |
AADSTS40009 | OAuth2IdPRefreshTokenRedemptionUserError – 联合标识提供者出现问题。 请联系 IDP 解决此问题。 |
AADSTS40010 | OAuth2IdPRetryableServerError – 联合标识提供者出现问题。 请联系 IDP 解决此问题。 |
AADSTS40015 | OAuth2IdPAuthCodeRedemptionUserError – 联合标识提供者出现问题。 请联系 IDP 解决此问题。 |
AADSTS50000 | TokenIssuanceError – 登录服务出现问题。 打开支持票证 以解决此问题。 |
AADSTS50001 | InvalidResource – 资源已禁用或不存在。 请检查应用代码,确保为尝试访问的资源指定了确切的资源 URL。 |
AADSTS50002 | NotAllowedTenant – 由于租户中的代理访问权限受限,登录失败。 如果这是你自己的租户策略,可以更改受限的租户设置来解决此问题。 |
AADSTS500011 | InvalidResourceServicePrincipalNotFound – 在名为 {tenant} 的租户中找不到名为 {name} 的资源主体。 如果租户管理员未安装该应用程序或租户中的任何用户未同意该应用程序,则可能会发生这种情况。 可能将身份验证请求发送给了错误的租户。 如果希望安装应用,可能需要提供管理员权限才能添加它。 请与资源和应用程序的开发人员联系,了解租户的正确设置。 |
AADSTS500014 | InvalidResourceServicePrincipalDisabled – 已禁用资源“{identifier}”的服务主体。 这表示租户中的订阅已失效,或者此租户的管理员已禁用应用程序的服务主体,从而阻止为其颁发令牌。 有关详细信息,请参阅 禁用应用程序的用户登录。 |
AADSTS500021 | 拒绝访问“{tenant}”租户。 AADSTS500021 指示已配置租户限制功能,并且用户正尝试访问标头 Restrict-Access-To-Tenant 指定的允许租户列表中没有的租户。 有关详细信息,请参阅 使用租户限制来管理对 SaaS 云应用程序的访问权限。 |
AADSTS500022 | 拒绝访问“{tenant}”租户。 AADSTS500022 指示已配置租户限制功能,并且用户正尝试访问标头 Restrict-Access-To-Tenant 指定的允许租户列表中没有的租户。 有关详细信息,请参阅 使用租户限制来管理对 SaaS 云应用程序的访问权限。 |
AADSTS50003 | MissingSigningKey – 由于缺少签名密钥或证书,登录失败。 这可能是因为应用中未配置任何签名密钥。 若要了解详细信息,请参阅有关错误 AADSTS50003的故障排除文章。 如果仍然出现问题,请联系应用所有者或应用管理员。 |
AADSTS50005 | DevicePolicyError – 用户尝试从条件访问策略目前不支持的平台登录到设备。 |
AADSTS50006 | InvalidSignature – 由于签名无效,签名验证失败。 |
AADSTS50007 | PartnerEncryptionCertificateMissing – 未找到此应用的合作伙伴加密证书。 向Microsoft提交支持票证以解决此问题。 |
AADSTS50008 | InvalidSamlToken – SAML 断言在令牌中缺失或配置错误。 请联系联合提供者。 |
AADSTS5000224 | NotAllowedTenantBlockedTenantFraud – 很抱歉,此资源不可用。 如果错误地看到此消息,请联系 Microsoft 支持人员。 |
AADSTS5000819 | InvalidSamlTokenEmailMissingOrInvalid – SAML 断言无效。 电子邮件地址声明缺失或与外部领域的域不匹配。 |
AADSTS50010 | AudienceUriValidationFailed – 由于未配置令牌受众,应用的受众 URI 验证失败。 |
AADSTS50011 | InvalidReplyTo – 回复地址缺失、配置错误或者与为应用配置的回复地址不匹配。 作为一种解决方法,请确保将此缺失的回复地址添加到 Microsoft Entra 应用程序,或者让有权在 Microsoft Entra ID 中管理你的应用程序的人员为你执行此操作。 若要了解详细信息,请参阅有关错误 AADSTS50011的故障排除文章。 |
AADSTS50012 | AuthenticationFailed – 身份验证由于以下原因之一而失败:未授权签名证书的使用者名称找不到与已授权使用者名称匹配的受信任颁发机构策略证书链无效签名证书无效未在租户中配置策略未授权签名证书的指纹客户端断言包含无效的签名 |
AADSTS50013 | InvalidAssertion – 多种原因导致断言无效 – 令牌颁发者与其有效时间范围内的 API 版本不匹配 – 已过期 – 格式不正确 – 断言中的刷新令牌不是主要刷新令牌。 请与应用开发人员联系。 |
AADSTS500133 | 断言不在其有效时间范围内。 确保访问令牌在用于用户断言之前没有过期,或请求一个新令牌。 当前时间:{curTime},断言的到期时间 {expTime}。 多种原因会导致断言无效:令牌颁发者与其有效时间范围内的 API 版本不匹配已过期格式错误断言中的刷新令牌不是主刷新令牌 |
AADSTS50014 | GuestUserInPendingState – 目录中不存在该用户帐户。 应用程序可能选择了错误的租户进行登录,并且当前登录的用户被阻止登录,因为它们不存在于你的租户中。 如果此用户应该能够登录,请将其添加为来宾。 有关详细信息,请访问 添加 B2B 用户。 |
AADSTS50015 | ViralUserLegalAgeConsentRequiredState – 用户需要法定年龄组许可。 |
AADSTS50017 | CertificateValidationFailed – 证书验证失败,原因如下:在受信任的证书列表中找不到颁发证书找不到所需的 CrlSegment在受信任的证书列表中找不到颁发证书在没有对应 CRL 分发点的情况下配置了增量 CRL 分发点由于超时问题,无法检索有效的 CRL 段无法下载 CRL请联系租户管理员。 |
AADSTS500141 | 用户的兑换已完成,但请求未由目标应用程序启动。 |
AADSTS5001256 | 由于id_token无效,无法通过外部提供程序完成身份验证。 失败详细信息:{details} |
AADSTS50020 | UserUnauthorized – 未授权用户调用此终结点。 来自标识提供者“{idp}”的用户帐户“{email}”不存在于租户“{tenant}”中,且无法访问该租户中的应用程序 ‘{appid}'({appName})。 该帐户需要先作为外部用户添加到租户中。 注销并使用另一 Microsoft Entra 用户帐户再次登录。 如果此用户应是租户的成员,则应通过 B2B 系统邀请他们。 有关其他信息,请访问 AADSTS50020。 |
AADSTS500207 | 帐户类型不能用于尝试访问的资源。 |
AADSTS500208 | 域不是该帐户类型的有效登录域 – 当用户帐户与给定租户的预期帐户类型不匹配时,会出现这种情况。 例如,如果租户配置为仅允许工作或学校帐户,而用户尝试使用个人 Microsoft 帐户登录,则会收到此错误。 |
AADSTS500212 | NotAllowedByOutboundPolicyTenant – 用户的管理员已设置出站访问策略,该策略不允许访问资源租户。 |
AADSTS500213 | NotAllowedByInboundPolicyTenant – 资源租户的跨租户访问策略不允许此用户访问此租户。 |
AADSTS50027 | InvalidJwtToken – 以下原因导致 JWT 令牌无效:不包含 nonce 声明和子声明使用者标识符不匹配idToken 声明中存在重复声明意外的颁发者意外的受众不在有效的时间范围内令牌格式不正确颁发者的外部 ID 令牌未通过签名验证。 |
AADSTS50029 | URI 无效 – 域名包含无效字符。 请联系租户管理员。 |
AADSTS50032 | WeakRsaKey – 指示错误的用户尝试使用弱 RSA 密钥。 |
AADSTS50033 | RetryableError – 指示与数据库操作不相关的暂时性错误。 |
AADSTS50034 | UserAccountNotFound – 若要登录到此应用程序,必须将帐户添加到目录中。 发生此错误的原因可能是用户键入了用户名错误,或者不在租户中。 应用程序可能选择了错误的租户登录,并且当前登录的用户被阻止登录,因为它们不存在于租户中。 如果此用户应该能够登录,请将其添加为来宾。 请参阅此处的文档: 添加 B2B 用户。 |
AADSTS50042 | UnableToGeneratePairwiseIdentifierWithMissingSalt – 原则中缺少用于生成成对标识符的盐。 请联系租户管理员。 |
AADSTS50043 | 无法使用多个盐值生成配对标识符 |
AADSTS50048 | SubjectMismatchesIssuer – 使用者与客户端断言中的颁发者声明不匹配。 请联系租户管理员。 |
AADSTS50049 | NoSuchInstanceForDiscovery – 未知或无效的实例。 |
AADSTS50050 | MalformedDiscoveryRequest – 请求格式不正确。 |
AADSTS50053 | 两种不同的原因会导致此错误: IdsLocked – 帐户已锁定,因为用户尝试使用不正确的用户 ID 或密码登录的次数过多。 用户因反复登录尝试而被阻止。 请参阅 修正风险并解除阻止用户。或者,由于登录来自具有恶意活动的 IP 地址而被阻止。 若要确定导致此错误的失败原因,请至少以云应用程序管理员身份登录到 Microsoft Entra 管理中心。 导航到Microsoft Entra 租户,然后 监控与运行状况>登录日志。 找到“登录错误代码”为 50053 的失败用户登录,然后检查“失败原因”。 |
AADSTS50055 | InvalidPasswordExpiredPassword – 密码已过期。 用户的密码已过期,因此其登录名或会话已结束。 他们将有机会重置密码,也可以要求管理员 使用 Microsoft Entra ID 重置用户密码。 |
AADSTS50056 | 密码无效或为 null:密码在此用户的目录中不存在。 应要求用户再次输入其密码。 |
AADSTS50057 | UserDisabled – 用户帐户处于禁用状态。 Active Directory 中支持此帐户的用户对象已禁用。 管理员可以通过 PowerShell 重新启用此帐户 |
AADSTS50058 | UserInformationNotProvided – 会话信息不足,无法进行单一登录。 这意味着用户未登录。 这是一个常见的错误,如果用户未经过身份验证并且尚未登录,则预期会出现此错误。 如果在用户之前已登录过的 SSO 上下文中遇到此错误,则表示 SSO 会话未找到或无效。 如果指定了 prompt=none,则可能会在应用程序中返回此错误。 |
AADSTS50059 | MissingTenantRealmAndNoUserInformationProvided – 在请求中未找到租户标识信息,或者任何提供的凭据未隐式指定此信息。 用户可以联系租户管理员来帮助解决此问题。 |
AADSTS50061 | SignoutInvalidRequest – 无法退出登录。请求无效。 |
AADSTS50064 | CredentialAuthenticationError – 用户名或密码凭据验证失败。 |
AADSTS50068 | SignoutInitiatorNotParticipant – 注销失败。 发起注销的应用不是当前会话中的参与者。 |
AADSTS50070 | SignoutUnknownSessionIdentifier – 注销失败。 注销请求指定了与现有会话不匹配的名称标识符。 |
AADSTS50071 | SignoutMessageExpired – 注销请求已过期。 |
AADSTS50072 | UserStrongAuthEnrollmentRequiredInterrupt – 用户需要注册双重身份验证(交互式)。 |
AADSTS50074 | UserStrongAuthClientAuthNRequiredInterrupt – 需要强身份验证,用户未通过 MFA 质询。 |
AADSTS50076 | UserStrongAuthClientAuthNRequired – 由于管理员做了配置更改(如条件访问策略),或者你已移到新位置,用户必须使用多重身份验证来访问资源。 请使用针对资源的新授权请求重试。 |
AADSTS50078 | UserStrongAuthExpired – 呈现的多重身份验证已过期(因为存在管理员配置的策略)。 你必须刷新多重身份验证才能访问“{resource}”。 |
AADSTS50079 | UserStrongAuthEnrollmentRequired – 由于管理员做了配置更改(如条件访问策略),或者因为用户已移到新位置,用户必须使用多重身份验证。 托管用户需要注册安全信息才能完成多重身份验证,或者联合用户需要从联合标识提供者获取多重声明。 |
AADSTS50085 | 刷新令牌需要社交 IDP 登录。 请让用户尝试使用用户名和密码再次登录 |
AADSTS50086 | Sas不可重试错误 |
AADSTS50087 | SasRetryableError – 强身份验证期间出现暂时性错误。 请重试。 |
AADSTS50088 | 已达到电信 MFA 呼叫限制。 请过几分钟重试。 |
AADSTS50089 | 由于流令牌过期,身份验证失败。 预期 – 身份验证代码、刷新令牌和会话会随着时间的推移而过期,或者由用户或管理员撤销。应用将请求用户进行新登录。 |
AADSTS50097 | DeviceAuthenticationRequired – 必须使用设备身份验证。 |
AADSTS50098 | JWT 正文必须包含“{field}”。 |
AADSTS50099 | PKeyAuthInvalidJwtUnauthorized – JWT 签名无效。 |
AADSTS50100 | 在转换令牌的声明时发生错误。 |
AADSTS50101 | 为主体“{principalId}”指定了未知声明转换器“{name}”。 |
AADSTS50102 | 无法加载为主体“{principalId}”指定的 CustomClaimsTransformer “{type}”。 |
AADSTS50103 | 转换令牌声明时出错:{errorMessage} |
AADSTS50105 | EntitlementGrantsNotFound – 未向已登录用户分配已登录应用的角色。 将用户分配给应用。 若要了解详细信息,请参阅有关错误 AADSTS50105的故障排除文章。 |
AADSTS50107 | 请求的联合领域对象“{name}”不存在。 应用程序错误 – 登录请求格式不正确,无法与现有身份验证终结点或实例匹配。 |
AADSTS50108 | 无法检索声明转换配置。 |
AADSTS50109 | 配置中找不到声明转换。 |
AADSTS50111 | 被要求应用未知的索赔转换。 |
AADSTS50117 | 未能反序列化请求声明参数中指定的策略。 |
AADSTS50120 | 未知凭据类型,JWT 标头出现问题。 请联系租户管理员。 |
AADSTS50123 | 为主体“{principalId}”指定了未知声明转换方法“{method}”。 |
AADSTS50124 | 为此应用程序的声明转换配置的正则表达式无效。 请与租户管理员联系以修复声明映射配置。 请参阅 自定义 SAML 令牌声明 |
AADSTS501241 | 转换 ID“{transformId}”中缺少必填的输入“{paramName}”。 Microsoft Entra ID 尝试向应用程序生成 SAML 响应时,将返回此错误。 NameID 声明或 NameIdentifier 在 SAML 响应中是必填内容,如果 Microsoft Entra ID 无法获取 NameID 声明的源属性,它将返回此错误。 作为一种解决方法,请确保添加声明规则。 若要添加声明规则,请至少以云应用程序管理员身份登录到 Microsoft Entra 管理中心,然后浏览到 Entra ID>Enterprise 应用。 选择应用程序,选择“单一登录”,然后在“用户属性和声明”中输入“唯一用户标识符(名称 ID)”。 |
AADSTS50125 | PasswordResetRegistrationRequiredInterrupt – 密码重置或密码注册条目导致登录中断。 |
AADSTS50126 | InvalidUserNameOrPassword – 无效的用户名或密码导致验证凭据时出错。 用户未输入正确的凭据。 由于用户出错,预计日志中会出现一些错误。 |
AADSTS50127 | BrokerAppNotInstalled – 用户需要安装中转站应用才能访问此内容。 |
AADSTS50128 | 域名无效 – 未在请求中找到或提供的任何凭据均未暗示任何租户标识信息。 |
AADSTS50129 | DeviceIsNotWorkplaceJoined – 需要加入工作区才能注册设备。 |
AADSTS50130 | 声明值 ‘{value}’ 无法解释为已知的认证方法。 |
AADSTS50131 | ConditionalAccessFailed – 指示各种条件访问错误,例如,Windows 设备状态不正确,请求因活动可疑、访问策略和安全策略决策而被阻止。 |
AADSTS50132 | SsoArtifactInvalidOrExpired – 会话由于密码过期或最近更改了密码而无效。 |
AADSTS50133 | SsoArtifactRevoked – 会话由于密码过期或最近更改了密码而无效。 |
AADSTS50134 | DeviceFlowAuthorizeWrongDatacenter – 错误的数据中心。 若要授权 OAuth 2.0 设备流中的应用发起的请求,授权方必须与原始请求位于同一数据中心。 |
AADSTS50135 | PasswordChangeCompromisedPassword – 由于帐户风险,需要更改密码。 |
AADSTS50136 | RedirectMsaSessionToApp – 检测到单个 MSA 会话。 |
AADSTS50137 | 由于安全策略规则,需要更改密码。 |
AADSTS50138 | 加密密钥环境无效。 |
AADSTS50139 | SessionMissingMsaOAuth2RefreshToken – 由于缺少外部刷新令牌,会话无效。 |
AADSTS50140 | KmsiInterrupt – 此错误是由于用户登录时出现“使我保持登录状态”中断而发生的。 这是登录流的预期部分,其中会询问用户是否希望保持登录到当前浏览器,以便以后更轻松地登录。 有关详细信息,请参阅新的 Microsoft Entra 登录和“使我保持登录状态”体验现已推出! 可以打开包含相关 ID、请求 ID 和错误代码 的支持票证 以获取更多详细信息。 |
AADSTS50141 | 受保护的密钥不适用于经过身份验证的用户。 |
AADSTS50142 | 由于条件访问策略,需要更改密码。 |
AADSTS50143 | 会话不匹配 – 会话无效,因为不同的资源导致用户租户与域提示不匹配。 打开包含相关 ID、请求 ID 和错误代码的支持票证以获取更多详细信息。 |
AADSTS50144 | InvalidPasswordExpiredOnPremPassword – 用户的 Active Directory 密码已过期。 为用户生成新密码,或者让用户使用自助重置工具重置其密码。 |
AADSTS50147 | 代码质询参数的大小无效。 请与应用程序所有者联系以更正他们对 PKCE 参数的使用。 |
AADSTS50148 | code_verifier与 PKCE 授权请求中提供的code_challenge不匹配。 请与应用程序所有者联系以更正他们对 PKCE 参数的使用。 |
AADSTS50146 | MissingCustomSigningKey – 需要为此应用配置特定于应用的签名密钥。 没有为此应用程序配置签名密钥,或者密钥已过期或尚未生效。 请联系应用程序的所有者。 |
AADSTS501461 | 仅与应用程序 GUID 匹配的令牌受众或租户的已验证域中的受众支持 AcceptMappedClaims。 更改资源标识符,或使用特定于应用程序的签名密钥。 |
AADSTS50147 | MissingCodeChallenge – 代码质询参数的大小无效。 |
AADSTS501481 | Code_Verifier 与授权请求中提供的 code_challenge 不匹配。 |
AADSTS50149 | Code_Challenge_method参数无效。 |
AADSTS501491 | InvalidCodeChallengeMethodInvalidSize – Code_Challenge 参数的大小无效。 |
AADSTS50150 | 提供的凭据没有有效的用户同意审批信息。 |
AADSTS50155 | DeviceAuthenticationFailed – 此用户的设备身份验证失败。 |
AADSTS50156 | V2 资源不支持设备令牌。 |
AADSTS50157 | 需要用户重定向以进行路由。 |
AADSTS50158 | 未满足外部安全质询。 用户将被重定向到另一个页面或身份验证提供程序,以满足其他身份验证质询。 用户还需要满足其他要求才能完成身份验证,于是被重定向到另一页(例如使用条款或第三方 MFA 提供程序)。 仅此代码不表示用户登录失败。 登录日志可指示此质询已成功通过或失败。 |
AADSTS50159 | 外部提供者发送的索赔是不足的。 |
AADSTS50160 | 首选不同的目标租户。 |
AADSTS50161 | 未能验证外部身份声明提供方的授权 URL。 |
AADSTS50162 | 声明转换已超时。这表示可能为此应用程序配置了过多或过于复杂的转换。 请求重试可能会成功。 否则,请联系管理员来修复配置。 |
AADSTS50163 | 声明转换的正则表达式替换导致声明超出大小限制。 请与管理员联系以修复配置。 |
AADSTS50164 | 提供的访问令牌未被颁发用于当前的使用目的。 需要一个具有用途为“{name}”的令牌。 |
AADSTS50165 | 此类型的令牌不支持应用程序请求的令牌加密算法“{algorithm}”。 这表示应用程序配置不正确。 |
AADSTS50166 | 对外部 OIDC 终结点的请求失败。 |
AADSTS50167 | pop_jwk密钥无效。 |
AADSTS50168 | 客户端能够利用 Windows 10 帐户扩展执行 SSO,但在请求中找不到 SSO 令牌或令牌已过期。 请求已中断以尝试拉取 SSO 令牌。 |
AADSTS50169 | InvalidRequestBadRealm – 领域不是当前服务命名空间的已配置领域。 |
AADSTS50170 | MissingExternalClaimsProviderMapping – 缺少外部控制映射。 |
AADSTS50171 | 给定受众只能在 Mutual-TLS 令牌调用中使用。 |
AADSTS50172 | 外部声明提供程序 {provider} 未获批准。 |
AADSTS50173 | 由于已吊销,提供的授权已过期,需要新的身份验证令牌。 用户可能已更改或重置其密码。 该授权是在“{authTime}”上颁发的,并且此用户的 TokensValidFrom 日期(在此日期之前无效)为“{validDate}”。 若要了解详细信息,请参阅有关错误 AADSTS50173的故障排除文章。 |
AADSTS50176 | 缺少外部控件的定义:{controlId}。 |
AADSTS50177 | ExternalChallengeNotSupportedForPassthroughUsers – 直通用户不支持外部质询。 |
AADSTS50178 | SessionControlNotSupportedForPassthroughUsers – 直通用户不支持会话控制。 |
AADSTS50180 | WindowsIntegratedAuthMissing – 需要 Windows 集成身份验证。 为租户启用无缝 SSO。 |
AADSTS50187 | DeviceInformationNotProvided – 服务无法执行设备身份验证。 |
AADSTS50192 | 无效的请求 – RawCredentialExpectedNotFound – 登录请求中不包含任何凭据。 示例:用户正在执行基于证书的身份验证 (CBA),但在登录请求中未发送任何证书或用户证书已被代理删除。 |
AADSTS50194 | 应用程序“{appId}”({appName}) 未配置为多租户应用程序。 在“{time}”之后创建的此类应用程序不支持使用 /common 终结点。 使用特定于租户的终结点,或将应用程序配置为多租户。 |
AADSTS50196 | LoopDetected – 检测到客户端循环。 检查应用的逻辑,以确保实现了令牌缓存,并且正确处理了错误情况。 该应用在太短的时间内发出了太多相同请求,表明它处于错误状态或滥用请求令牌。 |
AADSTS50197 | ConflictingIdentities – 找不到用户。 请尝试再次登录。 |
AADSTS50199 | CmsiInterrupt – 出于安全原因,此请求需要用户确认。 对移动浏览器中所有方案重定向显示中断。 无需采取措施。 系统要求用户确认此应用是其打算登录的应用程序。 这是一项有助于防止欺骗攻击的安全功能。 出现这种情况是因为系统 Web 视图已用于请求本机应用程序的令牌。 要避免此提示,重定向 URI 应是以下安全列表的一部分: http:// https:// chrome-extension://(仅限桌面 Chrome 浏览器) |
AADSTS51000 | RequiredFeatureNotEnabled – 已禁用该功能。 |
AADSTS51001 | DomainHintMustbePresent – 必须使用本地安全标识符或本地 UPN 提供域提示。 |
AADSTS1000104 | XCB2BResourceCloudNotAllowedOnIdentityTenant – 标识租户 {identityTenant} 上不允许资源云 {resourceCloud}。 {resourceCloud} – 拥有资源的云实例。 {identityTenant} – 是登录标识的来源租户。 |
AADSTS51004 | UserAccountNotInDirectory – 目录中不存在该用户帐户。 应用程序可能选择了错误的租户登录,并且当前登录的用户被阻止登录,因为它们不存在于租户中。 如果此用户应该能够登录,请将其添加为来宾。 有关详细信息,请访问 添加 B2B 用户。 |
AADSTS51005 | TemporaryRedirect – 等效于 HTTP 状态 307,表示请求的信息位于 location 标头中指定的 URI 处。 如果收到此状态,请遵循与响应关联的 location 标头操作。 如果原始请求方法是 POST,则重定向的请求也会使用 POST 方法。 |
AADSTS51006 | ForceReauthDueToInsufficientAuth – 需要 Windows 集成身份验证。 用户已使用缺少集成 Windows 身份验证声明的会话令牌登录。 请求用户重新登录。 |
AADSTS52004 | DelegationDoesNotExistForLinkedIn – 用户未许可访问 LinkedIn 资源。 |
AADSTS53000 | DeviceNotCompliant:条件访问策略需要合规设备,该设备不合规。 用户必须使用已批准的 MDM 提供程序(例如 Intune)注册其设备。 有关其他信息,请访问 条件访问设备修复。 |
AADSTS53001 | DeviceNotDomainJoined – 条件访问策略需要已加入域的设备,而该设备未加入域。 让用户使用已加入域的设备。 |
AADSTS53002 | ApplicationUsedIsNotAnApprovedApp – 使用的应用不是批准用于条件访问的应用。 用户需使用可用的获批准应用列表中的某个应用才能获取访问权限。 |
AADSTS53003 | BlockedByConditionalAccess – 条件访问策略已阻止访问。 访问策略不允许令牌颁发。 如果这是意外情况,请查看应用于此请求的条件访问策略,或与管理员联系。 有关更多信息,请访问 条件访问登录故障排除指南。 |
AADSTS530035 | BlockedBySecurityDefaults – 访问已被安全默认值阻止。 这是因为请求使用了旧式身份验证或被安全默认值策略视为不安全。 有关其他信息,请访问 强制实施的安全策略。 |
AADSTS53004 | ProofUpBlockedDueToRisk – 在访问此内容之前,用户需要完成多重身份验证注册过程。 用户应注册多重身份验证。 |
AADSTS53010 | ProofUpBlockedDueToSecurityInfoAcr – 无法配置多重身份验证方法,因为组织需要从特定的位置或设备设置此信息。 |
AADSTS53011 | 用户因主租户的风险而被阻止。 |
AADSTS530034 | DelegatedAdminBlockedDueToSuspiciousActivity – 由于主租户中的帐户风险,已阻止委派管理员访问租户。 |
AADSTS54000 | 未成年用户阻止法律年龄组规则 |
AADSTS54005 | OAuth2 授权代码已兑换,请使用新的有效代码重试,或使用现有的刷新令牌。 |
AADSTS65001 | DelegationDoesNotExist – 用户或管理员尚未许可将应用程序与 ID X 配合使用。请发送针对该用户和资源的交互式授权请求。 |
AADSTS65002 | 必须通过预授权在第一方应用程序“{applicationId}”与第一方资源“{resourceId}”之间配置同意 – 由 Microsoft 拥有和操作的应用程序必须先获得 API 所有者的批准,然后才能请求该 API 的令牌。 租户中的某位开发人员可能正在尝试重用 Microsoft 拥有的应用 ID。 此错误会导致他们无法模拟 Microsoft 应用程序来调用其他 API。 他们必须移动到其注册的另一个应用 ID。 |
AADSTS65004 | UserDeclinedConsent – 用户已拒绝许可访问该应用。 让用户重试登录并同意访问此应用 |
AADSTS65005 | MisconfiguredApplication – 应用所需的资源访问列表不包含可以通过资源来发现的应用,或者客户端应用请求访问的资源未在其必需的资源访问列表中指定,或者 Graph 服务返回了错误的请求,或者资源找不到。 如果应用支持 SAML,则原因可能是使用错误的标识符(实体)配置了应用。 若要了解详细信息,请参阅有关错误 AADSTS650056的故障排除文章。 |
AADSTS650052 | 应用需要访问你的组织 (\"{name}\") 尚未订阅或启用的服务 \"{organization}\" 。 若要查看服务订阅的配置,请与 IT 管理员联系。 |
AADSTS650054 | 应用程序请求访问已删除或不再可用的资源的权限。 确保应用调用的所有资源都存在于你正在操作中的租户中。 |
AADSTS650056 | 应用程序配置不正确。 这可能由以下原因之一造成:在客户端的应用程序注册中,客户端没有在所请求的权限中列出针对“{name}”的任何权限。 或者,管理员未在租户中表示同意。 或者,检查请求中的应用程序标识符,确保它与配置的客户端应用程序标识符匹配。 或者,检查请求中的证书,确保该证书有效。 请联系你的管理员来修复配置或者代表租户来表示同意。 客户端应用 ID:{ID}。 请联系你的管理员来修复配置或者代表租户来表示同意。 |
AADSTS650057 | 资源无效。 客户端已请求访问某个资源,但该资源未在客户端应用程序注册中的所需权限中列出。 客户端应用 ID:{appId}({appName})。 请求中的资源值:{resource}。 资源应用 ID:{resourceAppId}。 应用注册中的有效资源列表:{regList}。 |
AADSTS67003 | ActorNotValidServiceIdentity (演员无效服务标识) |
AADSTS70000 | InvalidGrant – 身份验证失败。 刷新令牌无效。 该错误的可能原因如下:令牌绑定标头为空令牌绑定哈希不匹配 |
AADSTS70001 | UnauthorizedClient – 应用程序处于禁用状态。 若要了解详细信息,请参阅有关错误 AADSTS70001的故障排除文章。 |
AADSTS700011 | UnauthorizedClientAppNotFoundInOrgIdTenant – 在目录中找不到标识符为 {appIdentifier} 的应用程序。 客户端应用程序从租户请求令牌,但租户中不存在该客户端应用,因此调用失败。 |
AADSTS70002 | InvalidClient – 验证凭据时出错。 指定的 client_secret 与此客户端的预期值不匹配。 请更正 client_secret,然后重试。 有关详细信息,请参阅 使用授权代码请求访问令牌。 |
AADSTS700025 | InvalidClientPublicClientWithCredential – 客户端是公共的,因此不应显示“client_assertion”和“client_secret”。 |
AADSTS700027 | 客户端断言未通过签名验证。 开发人员错误 – 应用尝试在没有必需的或正确的身份验证参数的情况下登录。 |
AADSTS70003 | UnsupportedGrantType – 应用返回了不受支持的授权类型。 |
AADSTS700030 | 证书无效 – 证书中的使用者名称未获授权。 令牌证书中的 SubjectNames/SubjectAlternativeNames(最多 10 个)为:{certificateSubjects}。 |
AADSTS70004 | InvalidRedirectUri – 应用返回了无效的重定向 URI。 客户端指定的重定向地址与配置的任何地址或者 OIDC 批准列表中的任何地址都不匹配。 |
AADSTS70005 | UnsupportedResponseType – 由于以下原因,应用返回了不受支持的响应类型:没有为应用启用响应类型“token”响应类型“id_token”需要“OpenID”作用域 – 编码的 wctx 中包含不支持的 OAuth 参数值 |
AADSTS700054 | 没有为应用程序启用响应类型“id_token”。 应用程序从授权终结点请求了 ID 令牌,但未启用 ID 令牌隐式授权。 以至少云应用程序管理员身份登录到 Microsoft Entra 管理中心,然后浏览到 Entra ID>应用注册。 选择应用程序,然后选择“身份验证”。 在“隐式授权和混合流”下,确保选择了“ID 令牌”。 |
AADSTS70007 | UnsupportedResponseMode – 请求令牌时,应用返回了不受支持的 response_mode 值。 |
AADSTS70008 | ExpiredOrRevokedGrant – 刷新令牌由于非活动状态而过期。 该令牌是在 XXX 颁发的,并在特定的时间内处于非活动状态。 |
AADSTS700082 | ExpiredOrRevokedGrantInactiveToken – 刷新令牌由于不活动而过期。 该令牌于 {issueDate} 发行,{time} 时处于非活动状态。 令牌生命周期的预期部分 – 用户在不使用应用程序的情况下长时间运行,因此当应用尝试刷新令牌时,令牌已过期。 |
AADSTS700084 | 刷新令牌已颁发给单页应用 (SPA),因此具有固定、有限的生命周期 {time},该生命周期无法延长。 刷新令牌现在已经过期,SPA 必须将新的登录请求发送到登录页面。 该令牌于 {issueDate} 颁发。 |
AADSTS70011 | InvalidScope – 应用请求的范围无效。 |
AADSTS70012 | MsaServerError – 对 MSA(使用者)用户进行身份验证时发生服务器错误。 重试。 如果它继续失败, 请开具支持票证 |
AADSTS70016 | AuthorizationPending – OAuth 2.0 设备流错误。 授权处于挂起状态。 设备将重试轮询请求。 |
AADSTS70018 | BadVerificationCode – 由于用户为设备代码流键入了错误的用户代码,验证码无效。 未批准授权。 |
AADSTS70019 | CodeExpired – 验证码已过期。 让用户重试登录。 |
AADSTS70043 | BadTokenDueToSignInFrequency – 由于条件访问进行登录频率检查,刷新令牌已过期或无效。 该令牌是在 {issueDate} 颁发的,此请求的最大允许生存期为 {time}。 |
AADSTS75001 | BindingSerializationError – SAML 消息绑定期间出错。 |
AADSTS75003 | UnsupportedBindingError – 应用返回了与不受支持的绑定相关的错误(无法通过 HTTP POST 以外的绑定发送 SAML 协议响应)。 |
AADSTS75005 | Saml2MessageInvalid – Microsoft Entra 不支持应用针对 SSO 所发送的 SAML 请求。 若要了解详细信息,请参阅有关错误 AADSTS75005的故障排除文章。 |
AADSTS7500514 | 找不到支持的 SAML 响应类型。 支持的响应类型为“Response”(在 XML 命名空间“’urn:oasis:names:tc:SAML:2.0:protocol”中)或“Assertion”(在 XML 命名空间“urn:oasis:names:tc:SAML:2.0:assertion”中)。 应用程序错误 – 开发人员会处理此错误。 |
AADSTS750054 | 必须在针对 SAML 重定向绑定的 HTTP 请求中将SAMLRequest 或 SAMLResponse 提供为查询字符串参数。 若要了解详细信息,请参阅有关错误 AADSTS750054的故障排除文章。 |
AADSTS75008 | RequestDeniedError – 由于 SAML 请求的目标不符合预期,来自应用的请求被拒绝。 |
AADSTS75011 | NoMatchedAuthnContextInOutputClaims – 用户在服务中用于身份验证的身份验证方法与请求的身份验证方法不匹配。 若要了解详细信息,请参阅有关错误 AADSTS75011的故障排除文章。 |
AADSTS75016 | Saml2AuthenticationRequestInvalidNameIDPolicy – SAML2 身份验证请求包含无效的 NameIdPolicy。 |
AADSTS76021 | ApplicationRequiresSignedRequests – 客户端发送的请求未签名,而应用程序需要签名的请求 |
AADSTS76026 | RequestIssueTimeExpired – SAML2 身份验证请求中的 IssueTime 已过期。 |
AADSTS80001 | OnPremiseStoreIsNotAvailable – 身份验证代理无法连接到 Active Directory。 确保代理服务器是需要验证其密码的用户所在的 AD 林的成员,并且能够连接到 Active Directory。 |
AADSTS80002 | OnPremisePasswordValidatorRequestTimedout – 密码验证请求超时。确保 Active Directory 可用,并且可以响应代理的请求。 |
AADSTS80005 | OnPremisePasswordValidatorUnpredictableWebException – 处理来自身份验证代理的响应时发生未知的错误。 重试请求。 如果它继续失败,开具支持请求以获取错误的详细信息。 |
AADSTS80007 | OnPremisePasswordValidatorErrorOccurredOnPrem – 身份验证代理无法验证用户的密码。 检查代理日志以了解更多信息,并验证 Active Directory 是否按预期方式运行。 |
AADSTS80010 | OnPremisePasswordValidationEncryptionException – 身份验证代理无法解密密码。 |
AADSTS80012 | OnPremisePasswordValidationAccountLogonInvalidHours – 用户尝试在允许的时间(在 AD 中指定)以外登录。 |
AADSTS80013 | OnPremisePasswordValidationTimeSkew – 由于运行身份验证代理的计算机与 AD 之间存在时间偏差,身份验证尝试无法完成。 解决时间同步问题。 |
AADSTS80014 | OnPremisePasswordValidationAuthenticationAgentTimeout – 超过最大已用时间后响应验证请求。 开具支持票证并提供错误代码、相关性 ID 和日期时间,以获取有关此错误的更多详细信息。 |
AADSTS81004 | DesktopSsoIdentityInTicketIsNotAuthenticated – Kerberos 身份验证尝试失败。 |
AADSTS81005 | DesktopSsoAuthenticationPackageNotSupported – 不支持该身份验证包。 |
AADSTS81006 | DesktopSsoNoAuthorizationHeader – 找不到授权标头。 |
AADSTS81007 | DesktopSsoTenantIsNotOptIn – 未为租户启用无缝 SSO。 |
AADSTS81009 | DesktopSsoAuthorizationHeaderValueWithBadFormat – 无法验证用户的 Kerberos 票证。 |
AADSTS81010 | DesktopSsoAuthTokenInvalid – 由于用户的 Kerberos 票证已过期或无效,无缝 SSO 失败。 |
AADSTS81011 | DesktopSsoLookupUserBySidFailed – 无法根据用户的 Kerberos 票证中的信息找到用户对象。 |
AADSTS81012 | DesktopSsoMismatchBetweenTokenUpnAndChosenUpn – 尝试登录到 Microsoft Entra ID 的用户不同于已登录到设备的用户。 |
AADSTS90002 | InvalidTenantName – 在数据存储中找不到该租户名称。 请确保租户 ID 正确。 如果应用程序开发人员尝试登录到找不到的租户,则应用程序开发人员将收到此错误。 通常,这是因为针对错误的云使用了跨云应用,或者开发人员尝试登录到从电子邮件地址派生的租户,但域未注册。 |
AADSTS90004 | InvalidRequestFormat – 请求格式不正确。 |
AADSTS90005 | InvalidRequestWithMultipleRequirements – 无法完成请求。 由于不能同时使用标识符和登录提示,请求无效。 |
AADSTS90006 | ExternalServerRetryableError – 服务暂时不可用。 |
AADSTS90007 | InvalidSessionId – 错误的请求。 无法分析传递的会话 ID。 |
AADSTS90008 | TokenForItselfRequiresGraphPermission – 用户或管理员尚未许可使用该应用程序。 最起码,应用程序需要通过指定登录并读取用户个人资料权限来访问 Microsoft Entra ID。 |
AADSTS90009 | TokenForItselfMissingIdenticalAppIdentifier – 应用程序正在请求自身的令牌。 仅当指定的资源使用基于 GUID 的应用程序 ID 时,才支持此方案。 |
AADSTS90010 | NotSupported – 无法创建该算法。 |
AADSTS9001023 | 不支持通过 /common 或 /consumers 终结点的授予类型。 请使用 /organizations 或特定于租户的终结点。 |
AADSTS90012 | RequestTimeout – 请求超时。 |
AADSTS90013 | InvalidUserInput – 用户的输入无效。 |
AADSTS90014 | MissingRequiredField – 如果预期的字段在凭据中不存在,则可能会显示此错误代码。 |
AADSTS900144 | 请求正文必须包含以下参数:“{name}”。 开发人员错误 – 应用尝试在没有必需的或正确的身份验证参数的情况下登录。 |
AADSTS90015 | QueryStringTooLong – 查询字符串过长。 |
AADSTS90016 | MissingRequiredClaim – 访问令牌无效。 缺少必需的声明。 |
AADSTS90019 | MissingTenantRealm – Microsoft Entra ID 无法确定请求中的租户标识符。 |
AADSTS90020 | SAML 1.1 断言缺少用户的 ImmutableID。 开发人员错误 – 应用尝试在没有必需的或正确的身份验证参数的情况下登录。 |
AADSTS90022 | AuthenticatedInvalidPrincipalNameFormat – 主体名称格式无效,或者不符合预期的 name[/host][@realm] 格式。 主体名称是必需的,而主机和领域是可选的,可设置为 null。 |
AADSTS90023 | InvalidRequest – 身份验证服务请求无效。 |
AADSTS900236 | InvalidRequestSamlPropertyUnsupported – SAML 身份验证请求属性“{propertyName}”不受支持,不得设置。 |
AADSTS9002313 | InvalidRequest – 请求格式错误或无效。 – 之所以出现此问题,是因为对某个终结点的请求出了问题。 对此问题的建议是获取发生的错误的 fiddler 跟踪,并查看请求的格式是否确实正确。 |
AADSTS9002332 | 应用程序“{principalId}”({principalName}) 配置为仅供 Microsoft Entra 用户使用。 请勿使用 /consumers 终结点来为此请求提供服务。 |
AADSTS90024 | RequestBudgetExceededError – 发生了暂时性错误。 重试。 |
AADSTS90027 | 我们无法从 MSA 租户上的此 API 版本颁发令牌。 请与应用程序供应商联系,因为他们需要使用协议版本 2.0 来支持此操作。 |
AADSTS90033 | MsodsServiceUnavailable – Microsoft Online Directory Service (MSODS) 不可用。 |
AADSTS90036 | MsodsServiceUnretryableFailure – MSODS 托管的 WCF 服务发生意外的不可重试错误。 打开服务工单 以获取有关错误的更多详细信息。 |
AADSTS90038 | NationalCloudTenantRedirection – 指定的租户“Y”属于国家/地区云“X”。 当前云实例“Z”未与 X 联合。返回了云重定向错误。 |
AADSTS900384 | JWT 令牌签名验证失败。 实际消息内容是特定于运行时的,此错误有多种原因。 有关详细信息,请查看返回的异常消息。 |
AADSTS90043 | NationalCloudAuthCodeRedirection – 已禁用该功能。 |
AADSTS900432 | 跨云请求不支持机密客户端。 |
AADSTS90051 | InvalidNationalCloudId – 国家云标识符包含无效的云标识符。 |
AADSTS90055 | TenantThrottlingError – 传入的请求过多。 此异常是针对阻止的租户引发的。 |
AADSTS90056 | BadResourceRequest – 若要兑换访问令牌的代码,应用应该向 /token 终结点发送 POST 请求。 另外,在此之前,应该提供授权代码,并在发往 /token 终结点的 POST 请求中发送此代码。 有关 OAuth 2.0 授权代码流的概述,请参阅本文。 将用户定向到 /authorize 终结点,该终结点会返回 authorization_code。 通过向 /token 终结点发布请求,用户可以获取访问令牌。 检查“应用注册”>“终结点”以确认是否正确配置了两个终结点。 |
AADSTS900561 | BadResourceRequestInvalidRequest – 终结点仅接受 {valid_verbs} 请求。 收到 {invalid_verb} 请求。 {valid_verbs} 表示终结点支持的 HTTP 谓词列表(例如,POST),{invalid_verb} 是当前请求中使用的 HTTP 谓词(例如,GET)。 这可能是由于开发人员错误,或者用户在其浏览器中按下后退按钮,从而触发了错误的请求。 这可予以忽视。 |
AADSTS90072 | PassThroughUserMfaError – 用户登录时所用的外部帐户在其登录到的租户中不存在;因此,该用户无法满足该租户的 MFA 要求。 如果用户已同步,但是 Active Directory 和 Microsoft Entra ID 之间的 ImmutableID (sourceAnchor) 属性不匹配,也可能会发生此错误。 必须先将该帐户作为外部用户添加到该租户中。 注销并使用另一 Microsoft Entra 用户帐户登录。 有关详细信息,请访问 配置外部标识。 |
AADSTS90081 | OrgIdWsFederationMessageInvalid – 服务尝试处理 WS 联合身份验证消息时出错。 消息无效。 |
AADSTS90082 | OrgIdWsFederationNotSupported – 目前不支持对该请求使用所选的身份验证策略。 |
AADSTS90084 | OrgIdWsFederationGuestNotAllowed – 此站点不允许来宾帐户。 |
AADSTS90085 | OrgIdWsFederationSltRedemptionFailed – 由于尚未预配公司对象,服务无法颁发令牌。 |
AADSTS90086 | OrgIdWsTrustDaTokenExpired – 用户 DA 令牌已过期。 |
AADSTS90087 | OrgIdWsFederationMessageCreationFromUriFailed – 从 URI 创建 WS 联合身份验证消息时出错。 |
AADSTS90090 | GraphRetryableError – 服务暂时不可用。 |
AADSTS90091 | 图形服务不可访问 |
AADSTS90092 | 图表不可重试错误 |
AADSTS90093 | GraphUserUnauthorized – Graph 返回了针对请求的禁止访问错误代码。 |
AADSTS90094 | AdminConsentRequired – 需要管理员许可。 |
AADSTS900382 | 跨云请求不支持机密客户端。 |
AADSTS90095 | AdminConsentRequiredRequestAccess – 在管理员同意工作流体验中,当告知用户需要请求管理员同意时出现的中断。 |
AADSTS90099 | 应用程序“{appId}”({appName}) 未在租户“{tenant}”中获得授权。 应用程序必须获得访问外部租户的授权,然后合作伙伴委托的管理员才能使用它们。 若要为应用程序授权,请提供预先许可或执行相应的合作伙伴中心 API。 |
AADSTS900971 | 未提供回复地址。 |
AADSTS90100 | InvalidRequestParameter – 参数为空或无效。 |
AADSTS901002 | AADSTS901002:不支持“resource”请求参数。 |
AADSTS90101 | InvalidEmailAddress – 提供的数据不是有效的电子邮件地址。 电子邮件地址必须采用 someone@example.com 格式。 |
AADSTS90102 | InvalidUriParameter – 值必须是有效的绝对 URI。 |
AADSTS90107 | InvalidXml – 请求无效。 请确保数据不包含无效字符。 |
AADSTS90112 | 应用程序标识符预期为 GUID。 |
AADSTS90114 | InvalidExpiryDate – 批量令牌过期时间戳会导致颁发过期的令牌。 |
AADSTS90117 | 无效请求输入 |
AADSTS90119 | InvalidUserCode – 用户代码为 null 或为空。 |
AADSTS90120 | InvalidDeviceFlowRequest – 请求已获授权或被拒绝。 |
AADSTS90121 | InvalidEmptyRequest – 无效的空请求。 |
AADSTS90123 | IdentityProviderAccessDenied – 由于标识或声明颁发提供者拒绝了请求,无法颁发该令牌。 |
AADSTS90124 | V1ResourceV2GlobalEndpointNotSupported – /common 或 /consumers 终结点不支持该资源。 请改用 /organizations 或特定于租户的终结点。 |
AADSTS90125 | DebugModeEnrollTenantNotFound – 用户不在系统中。 请务必正确输入用户名。 |
AADSTS90126 | DebugModeEnrollTenantNotInferred – 此终结点不支持该用户类型。 系统无法从用户名推断用户的租户。 |
AADSTS90130 | NonConvergedAppV2GlobalEndpointNotSupported – /common 或 /consumers 终结点不支持该应用程序。 请改用 /organizations 或特定于租户的终结点。 |
AADSTS120000 | 当前密码变更错误 |
AADSTS120002 | 密码更改无效,新密码太弱 |
AADSTS120003 | 新密码无效,因为它包含了会员的名字。 |
AADSTS120004 | 本地密码复杂性更改 |
AADSTS120005 | 本地密码更改成功云端失败 |
AADSTS120008 | PasswordChangeAsyncJobStateTerminated – 发生了不可重试的错误。 |
AADSTS120011 | PasswordChangeAsyncUpn推断失败 |
AADSTS120012 | 需要在现场更改密码 |
AADSTS120013 | 密码更改本地连接失败 |
AADSTS120014 | 现场用户帐户被锁定或禁用时更改密码 |
AADSTS120015 | 密码更改需要Active Directory管理员操作 |
AADSTS120016 | 无法通过自助密码重置找到用户 |
AADSTS120018 | 密码变更:密码不符合模糊政策要求 |
AADSTS120020 | 密码更改失败 |
AADSTS120021 | 伙伴服务SSPR内部服务错误 |
AADSTS130004 | NgcKeyNotFound – 未为用户主体配置 NGC ID 密钥。 |
AADSTS130005 | NgcInvalidSignature – NGC 密钥签名验证失败。 |
AADSTS130006 | NgcTransportKeyNotFound – 设备上未配置 NGC 传输密钥。 |
AADSTS130007 | NgcDeviceIsDisabled – 设备已禁用。 |
AADSTS130008 | NgcDeviceIsNotFound – 找不到 NGC 密钥引用的设备。 |
AADSTS135010 | 找不到密钥 |
AADSTS135011 | 在身份验证期间使用的设备已禁用。 |
AADSTS140000 | InvalidRequestNonce – 未提供请求 nonce。 |
AADSTS140001 | InvalidSessionKey – 会话密钥无效。 |
AADSTS165004 | 实际消息内容是特定于运行时的。 有关详细信息,请查看返回的异常消息。 |
AADSTS165900 | InvalidApiRequest – 请求无效。 |
AADSTS220450 | UnsupportedAndroidWebViewVersion – 不支持 Chrome WebView 版本。 |
AADSTS220501 | 无效CRL下载 |
AADSTS221000 | DeviceOnlyTokensNotSupportedByResource – 资源未配置为接受仅限设备的令牌。 |
AADSTS240001 | BulkAADJTokenUnauthorized – 未授权用户在 Microsoft Entra ID 中注册设备。 |
AADSTS240002 | RequiredClaimIsMissing – 无法将 id_token 用作 urn:ietf:params:oauth:grant-type:jwt-bearer 授予。 |
AADSTS501621 | ClaimsTransformationTimeoutRegularExpressionTimeout – 声明转换的正则表达式替换已超时。这表示为此应用程序配置的正则表达式可能过于复杂。 请求重试可能会成功。 否则,请联系管理员来修复配置。 |
AADSTS530032 | BlockedByConditionalAccessOnSecurityPolicy – 租户管理员已配置了阻止此请求的安全策略。 检查在租户级别定义的安全策略来确定你的请求是否满足策略要求。 |
AADSTS700016 | UnauthorizedClient_DoesNotMatchRequest – 应用程序中找不到目录/租户。 如果应用程序尚未由租户管理员安装,或者尚未获得租户中的任何用户同意,则可能会发生这种情况。 可能错误配置了应用程序的标识符值,或者将身份验证请求发送到了错误的租户。 |
AADSTS700020 | InteractionRequired – 访问权限授予需要交互。 |
AADSTS700022 | InvalidMultipleResourcesScope – 为输入参数范围提供的值无效,因为它包含多个资源。 |
AADSTS700023 | InvalidResourcelessScope – 请求访问令牌时,为输入参数范围提供的值无效。 |
AADSTS7000215 | 提供的客户端密码无效。 开发人员错误 – 应用尝试在没有必需的或正确的身份验证参数的情况下登录。 |
AADSTS7000218 | 请求正文必须包含以下参数:“client_assertion”或“client_secret”。 |
AADSTS7000222 | InvalidClientSecretExpiredKeysProvided – 提供的客户端密钥已过期。 为你的应用创建新密钥,或者考虑使用证书凭据提高安全性:https://aka.ms/certCreds |
AADSTS700229 | ForbiddenTokenType – 只有仅限应用的令牌可用作 Microsoft Entra 颁发者的联合标识凭据。 使用(在客户端凭据流期间生成的)仅应用访问令牌,而不是用户委托的访问令牌(表示请求来自用户上下文)。 |
AADSTS700005 | InvalidGrantRedeemAgainstWrongTenant – 提供的授权代码是用于其他租户的,因此已被拒绝。 兑换 OAuth2 授权代码时所针对的租户必须是获取该代码时所针对的租户(根据情况使用 /common 或 {tenant ID} 进行指定) |
AADSTS1000000 | UserNotBoundError – 绑定 API 要求 Microsoft Entra 用户同时使用外部 IDP 进行身份验证,但尚未执行此操作。 |
AADSTS1000002 | BindCompleteInterruptError – 绑定已成功完成,但必须通知用户。 |
AADSTS100007 | Microsoft Entra 区域仅支持使用适用于 Microsoft 基础结构租户中的 1P 应用或 3P 应用的 SN+I,对 MSI 或来自 MSAL 的请求进行身份验证。 |
AADSTS1000031 | 目前无法访问应用程序 {appDisplayName}。 请与您的管理员联系。 |
AADSTS7000112 | UnauthorizedClientApplicationDisabled – 应用程序处于禁用状态。 |
AADSTS7000114 | 不允许使用应用程序“appIdentifier”进行应用程序代理调用。 |
AADSTS7500529 | 值“SAMLId-Guid”不是有效的 SAML ID – Microsoft Entra ID 使用此属性填充返回的响应的 InResponseTo 属性。 ID 的开头不能是数字,因此常见的策略是在 GUID 的字符串表示形式前面加上类似于“ID”的字符串。 例如,id6c1c178c166d486687be4aaf5e482730 是有效的 ID。 |
AADSTS9002341 | V2Error:invalid_grant – 用户必须允许单一登录 (SSO)。 如果用户未授予应用程序执行 SSO 所需的权限,则会发生此错误。 用户应重定向到同意屏幕,以授予必要的权限。 有关详细信息,请参阅 此公告 。 |
AADSTS901011 | NoEmailAddressCollectedFromExternalOidcIDP – 未从外部 OpenID Connect (OIDC) 标识提供者获取电子邮件地址。 当用户在注册时选择“隐藏我的电子邮件”时,通常会发生这种情况。 |
AADSTS901012 | EmailAddressCollectedFromExternalOidcIDPNotVerified – 未从标识提供者获取任何已验证的电子邮件地址。 电子邮件地址未在外部 OIDC 标识提供者的 ID 令牌中验证。 |
AADSTS901014 | NoExternalIdentifierCollectedFromExternalOidcIDP – 外部标识符不存在于来自外部 OIDC 标识提供者的 ID 令牌中。 |
AADSTS650059 | 未将应用程序配置为在租户中使用。 为应用程序属性AzureADMyOrg 设置的值signInAudience 限制其在租户中的使用。 |