【问题标题】:How can I authorize a .NET 5.0 / C# application to interact with Microsoft 365 SharePoint Online without user interaction?如何授权 .NET 5.0 / C# 应用程序在没有用户交互的情况下与 Microsoft 365 SharePoint Online 交互?
【发布时间】:2021-03-01 22:26:28
【问题描述】:

我需要创建一个 web 服务,它将接受来自用户的文件,解析文件中的数据,组装存储在 Sharepoint 上的文件集合,并将包含这些文件的 zip 文件返回给用户。 用户可能无法直接访问 Sharepoint,并且将来甚至可能没有人类用户参与,因为文件可能会在计时器上自动从另一个系统中提取。

我正在用 C# 创建解决方案,并且正在努力创建一个可以成功针对 Sharepoint 进行身份验证的客户端。

目前,我正在尝试使用 Microsoft 文档中的 CSOM Authentication Manager,但使用 Visual Studio 调试器时,我发现此方法失败:

        private async Task<string> AcquireTokenAsync(Uri resourceUri, string username, string password)
        {
            string resource = $"{resourceUri.Scheme}://{resourceUri.DnsSafeHost}";

            var clientId = defaultAADAppId;
            var body = $"resource={resource}&client_id={clientId}&grant_type=password&username={HttpUtility.UrlEncode(username)}&password={HttpUtility.UrlEncode(password)}";
            using (var stringContent = new StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded"))
            {

                var result = await httpClient.PostAsync(tokenEndpoint, stringContent).ContinueWith((response) =>
                {
                    return response.Result.Content.ReadAsStringAsync().Result;
                }).ConfigureAwait(false);

                var tokenResult = JsonSerializer.Deserialize<JsonElement>(result);
                var token = tokenResult.GetProperty("access_token").GetString();
                return token;
            }
        }

结果的值为:

"{"error":"unauthorized_client","error_description":"AADSTS700016: 在目录 'enpal.de' 中找不到标识符为 '986002f6-c3f6-43ab-913e-78cca185c392' 的应用程序。如果租户管理员未安装应用程序或未获得租户中任何用户的同意,则可能会发生这种情况。你可能将身份验证请求发送给了错误的租户。\r\n跟踪 ID:d3b47a0b-54bc-40fd-a731-b99732326200\r\n相关 ID:158621cc-3052-4c7b-9532-e2bab5c3cc09\r\n时间戳:2020-11 -18 13:46:39Z","error_codes":[700016],"timestamp":"2020-11-18 13:46:39Z","trace_id":"d3b47a0b-54bc-40fd-a731-b99732326200", "correlation_id":"158621cc-3052-4c7b-9532-e2bab5c3cc09","error_uri":"https://login.microsoftonline.com/error?code=700016"}"

resourceUri、用户名和密码值正确对应于我将直接用于登录网站的值。我的管理员向我保证,该用户是该站点的管理员,因此应该拥有执行任何操作(包括连接)所需的所有可能权限。

有人知道怎么做吗?
或者知道更可能起作用的不同解决方案? 或者知道必须在 SharePoint 端进行哪些配置才能使该解决方案正常工作?

【问题讨论】:

  • 可能是 AAD 管理员需要在 AAD 门户中同意您的应用程序
  • @ADyson,我的应用程序仍处于早期状态。而且我在 C# 和 AAD 方面的经验非常有限。我们需要做什么才能获得这笔赠款?
  • 我刚刚在下面看到@Vincent 的回答......所以也许这是同一件事?现在试试。
  • 是的,大致相同

标签: c# authentication sharepoint integration csom


【解决方案1】:

您似乎从 Microsoft 网站获取了代码示例,并跳过阅读重要部分:Configuring an application in Azure AD ;)

目前,您正尝试将应用程序连接到您的租户,该应用程序的 ID 为“986002f6-c3f6-43ab-913e-78cca185c392”,这是代码示例中的占位符。在租户中注册您的应用,并在 defaultAADAppId 常量中插入正确的应用 ID。

【讨论】:

  • 是的,你是对的!我错过了这个。谢谢!我目前正在尝试并在验证它有效后接受答案,:) (注意:文档和我在 UI 中的体验之间存在一些差异,但我认为我已经弄清楚了我需要做什么......)
  • 谢谢!在弄清楚它需要哪个 Id 以及如何授予权限之后,它起作用了! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多