应用权限模式下如何指定OneDrive for Business的目标用户?
问题解答
1. 如何指定具体用户的OneDrive?
使用应用权限时,直接在Graph API请求路径中指定目标用户的用户主体名称(UPN,格式如user@yourdomain.com)或用户ID即可。比如你的上传URL需要修改为:
https://graph.microsoft.com/v1.0/users/目标用户UPN或ID/drive/root:/DropFileIn/{文件名}:/content
例如目标用户UPN是john@contoso.com,则URL为:
https://graph.microsoft.com/v1.0/users/john@contoso.com/drive/root:/DropFileIn/test.txt:/content
2. 是否需要对该用户进行认证?
不需要。应用权限是授予给应用本身的权限,允许应用直接访问租户内所有符合权限范围的用户资源(前提是权限已由管理员审批通过)。你需要切换到**客户端凭证流(Client Credentials Flow)**获取应用级别的访问令牌,而非之前的用户名密码流(该流属于委托权限场景,且会触发2FA导致失败)。
修改后的代码示例
import os import requests import msal # 配置信息 CLIENT_ID = '你的应用ID' TENANT_ID = '你的租户ID' CLIENT_SECRET = '你的应用客户端密钥' # 应用注册时生成,应用权限必须使用 AUTHORITY_URL = f'https://login.microsoftonline.com/{TENANT_ID}' # 应用权限的scope固定为 https://graph.microsoft.com/.default SCOPES = ['https://graph.microsoft.com/.default'] # 初始化机密客户端应用(应用权限场景需用此类) app = msal.ConfidentialClientApplication( CLIENT_ID, authority=AUTHORITY_URL, client_credential=CLIENT_SECRET ) # 获取应用级访问令牌 token_result = app.acquire_token_for_client(scopes=SCOPES) if 'access_token' not in token_result: print(f"令牌获取失败: {token_result.get('error_description')}") exit() headers = {'Authorization': f"Bearer {token_result['access_token']}"} # 目标用户的UPN或用户ID target_user = 'john@contoso.com' # OneDrive中的目标文件夹路径 target_folder = '/DropFileIn' # 遍历本地文件夹上传文件 for root, dirs, files in os.walk('C:/Users/Lenovo/Documents/securepass'): for file_name in files: file_path = os.path.join(root, file_name) file_size = os.stat(file_path).st_size # 读取文件内容(使用with语句自动关闭文件) with open(file_path, 'rb') as file_data: if file_size < 4100000: # 构造上传URL upload_url = f"https://graph.microsoft.com/v1.0/users/{target_user}/drive/root:{target_folder}/{file_name}:/content" # 发送上传请求 response = requests.put(upload_url, data=file_data, headers=headers) # 检查请求是否成功 if response.status_code == 201: print(f"文件 {file_name} 上传成功") else: print(f"文件 {file_name} 上传失败: {response.text}")
关键注意事项
- 应用权限需要全局管理员在Azure AD管理中心为你的应用授予(例如
Files.ReadWrite.All应用权限),授予后应用可访问租户内所有用户的OneDrive。 - 不要使用
PublicClientApplication处理应用权限场景,应改用ConfidentialClientApplication,并提供客户端密钥(或证书)。 - 原代码中的
allowPublicClient设置适用于公共客户端应用(如桌面APP),但应用权限场景下,应用本质上是机密客户端,该设置可保留但不影响客户端凭证流的使用。
内容的提问来源于stack exchange,提问作者Abhishek Rai
相关产品推荐
相关产品推荐

