如何授权 .NET 5.0 / C# 应用程序在没有用户交互的情况下与 Microsoft 365 SharePoint Online 交互?

Posted

技术标签:

【中文标题】如何授权 .NET 5.0 / C# 应用程序在没有用户交互的情况下与 Microsoft 365 SharePoint Online 交互?【英文标题】:How can I authorize a .NET 5.0 / C# application to interact with Microsoft 365 SharePoint Online without user interaction? 【发布时间】: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 的回答......所以也许这是同一件事?现在试试。 是的,大致相同 【参考方案1】:

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

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

【讨论】:

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

以上是关于如何授权 .NET 5.0 / C# 应用程序在没有用户交互的情况下与 Microsoft 365 SharePoint Online 交互?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .Net 5.0 C# 或 F# 中编写以特定时间间隔定期运行的代码

C# ASP.NET Core 5.0 - 为啥在使用 [Authorization] 时甚至不调用该方法

Asp.Net Core Web API 5.0 和 Angular 中基于自定义角色的授权

如何确定在 C# ASP.NET CORE MVC 5.0 中选择了哪个单选按钮

如何在 ASP.NET Core 5.0 中处理来自客户端的双重请求?

我们可以在 asp.net c# web 应用程序中嵌入对 twitter、linkedin、facebook、buzz 的授权吗?