我在 .NET 方面经验丰富,但对 Sharepoint 和 Project Online 还很陌生。 我很好奇它是 MFA 还是发生了什么,但我总是得到一个
The remote server returned an error: (403) FORBIDDEN
获取代码
public async Task<ProjectContext?> GetContextWithCredentialsAsync(string url, string username, string password)
{
try
{
if (url.ToUpper().StartsWith("HTTP://") || url.ToUpper().StartsWith("HTTPS://"))
{
var securePassword = new SecureString();
password.ToCharArray().ToList().ForEach(s => securePassword.AppendChar(s));
var clientContext = new ProjectContext(url)
{
Credentials = new NetworkCredential(username, securePassword)
};
clientContext.Load(clientContext.Projects);
clientContext.ExecuteQuery();
return await System.Threading.Tasks.Task.Factory.StartNew(() => { return clientContext; });
}
}
catch (Exception ex)
{
throw ex;
}
return null;
}
我在网上看到了其他类似的代码这样做,我想这可能是 MFA,我需要获得身份验证,但我看到的其他链接是较旧的 .NET。 我正在使用库:“Microsoft.SharePointOnline.CSOM”版本 16.1.24810.12000 在 .NET 8 Web API 中调用上面的代码。
-> 验证凭据: 确保您使用的用户名和密码正确,并且具有访问该 URL 所需的权限。
-> 检查网址: 确认 URL 正确且可访问。有时,URL 可能有限制或可能需要不同的格式。
-> 安全字符串用法: 对于 NetworkCredential,代码中 SecureString 的使用不正确。相反,SecureString 应直接与 Password 属性一起使用。
-> HTTP 身份验证: 确保服务器支持使用 NetworkCredential 的基本身份验证。如果它使用其他方法(例如 OAuth),您需要相应地调整您的方法。
这是您的方法的修订版本,它纠正了 SecureString 的使用并改进了整体结构:
公共异步任务
var credentials = new NetworkCredential(username, securePassword);
// Create a ProjectContext and set the credentials
var clientContext = new ProjectContext(url)
{
Credentials = credentials
};
// Load and execute the query
clientContext.Load(clientContext.Projects);
await clientContext.ExecuteQueryAsync();
return clientContext;
}
}
catch (Exception ex)
{
// Consider logging the exception rather than throwing
Console.WriteLine($"Error: {ex.Message}");
}
return null;
}
--> 正确使用await 关键字。当您已经处于异步方法中时,不需要使用 Task.Factory.StartNew。