无法从 Sharepoint Office 365 获取 Project Online 的 ProjectContext 并在 .NET 8 中获取 403

问题描述 投票:0回答:1

我在 .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 中调用上面的代码。

c# authentication .net-8.0 project-online sharepoint-office365
1个回答
0
投票

-> 验证凭据: 确保您使用的用户名和密码正确,并且具有访问该 URL 所需的权限。

-> 检查网址: 确认 URL 正确且可访问。有时,URL 可能有限制或可能需要不同的格式。

-> 安全字符串用法: 对于 NetworkCredential,代码中 SecureString 的使用不正确。相反,SecureString 应直接与 Password 属性一起使用。

-> HTTP 身份验证: 确保服务器支持使用 NetworkCredential 的基本身份验证。如果它使用其他方法(例如 OAuth),您需要相应地调整您的方法。

这是您的方法的修订版本,它纠正了 SecureString 的使用并改进了整体结构:

公共异步任务 GetContextWithCredentialsAsync(字符串网址,字符串用户名,字符串密码) { 尝试 { if (url.ToUpper().StartsWith("HTTP://") || url.ToUpper().StartsWith("HTTPS://")) { // 为密码创建一个 SecureString var securePassword = new SecureString(); foreach(密码中的字符 c) { securePassword.AppendChar(c); } securePassword.MakeReadOnly();

        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。

© www.soinside.com 2019 - 2024. All rights reserved.