如果我们将“DisableCustomAppAuthentication”设置为 true,如何针对 SharePoint 在线验证我们的 .NET 控制台应用程序

How to authenticate our .NET console application against SharePoint online if we have `DisableCustomAppAuthentication` set to true

我们有以下内容:-

现在以前在旧租户上我使用此方法通过传递 ClientID 和 Client Secret 来验证我的代码:-

      static void Main(string[] args)
              {
                       
                  string siteUrl = "https://***.sharepoint.com/sites/CustomerServiceKB/";
                  string clientId = "******";
                  string clientSecret = "*****";
                  using (ClientContext context = new OfficeDevPnP.Core.AuthenticationManager().GetAppOnlyAuthenticatedContext(siteUrl, clientId, clientSecret))
            
                  {

但是在我们新创建的租户上,我们无法使用上述方法验证我们的代码,因为我们将 DisableCustomAppAuthentication 设置为 true.. 现在我们不想修改此 属性。

所以我们的问题是;如果我们将 DisableCustomAppAuthentication 设置为 true(我们不想将其设置为 false),那么我们如何验证我们的控制台应用程序?它托管在我们的 windows 服务器内,并使用任务调度程序按计划运行?

因此 DisableCustomAppAuthentication 属性 被引入(默认设置为 true)以支持 Azure 访问控制服务 (ACS) 的 deprecation .在 Sharepoint 租户中验证自定义应用程序的现代方法是在 Azure AD 中注册它们。

在继续之前,请考虑切换到新身份验证方案的利弊。主要是,ACS 使用户能够精细地控制应用程序身份验证的站点级权限,但 Azure AD 应用程序注册使 运行ning 应用程序集对管理员透明。如果您想继续使用 ACS,只需将 DisableCustomAppAuthentication 设置为 false

现在,如果您决定继续在 Azure ID 中注册应用程序,请遵循以下步骤:

  1. 登录到 Azure 门户并导航到 Azure Active Directory。

  2. 在 Azure AD 门户中注册应用程序。 guide 介绍了如何操作。在应用程序概览页面获取应用程序(客户端)ID

  3. 设置所有必要的权限,confirm them作为全局管理员(或请管理员确认)。

  4. Configure 认证。选择身份验证选项:您是否希望应用程序通过加密证书或客户端机密在 Microsoft IAM 中对自身进行身份验证。

  5. 获取您的 Azure Active Directory 租户 ID(不要与 Sharepoint Online 租户 ID 混淆)。这里是 how to do in in the Azure AD; there's also a hacky way.

  6. 现在使用客户端 ID(来自第 2 步)、身份验证选项(第 4 步)和 AAD 租户 ID(第 5 步)来验证和 运行 您的应用程序:

      using Microsoft.Identity.Client;
    
      [..]
    
      private static async Task<string> GetToken()
      {
          string applicationId = "client-id";
          string tenantId = "aad-tenant-id";
          bool isUsingClientSecret = <true or false>;
    
          IConfidentialClientApplication app;
    
          if (isUsingClientSecret)
          {
              string secret = "secret";
              app = ConfidentialClientApplicationBuilder.Create(applicationId)
                  .WithClientSecret(secret)
                  .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
                  .Build();
          }
    
          else
          {
              string certificateLocation = "certificate-file";
              X509Certificate2 certificate = ReadCertificate(certificateLocation);
              app = ConfidentialClientApplicationBuilder.Create(applicationId)
                  .WithCertificate(certificate)
                  .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
                  .Build();
          }
    
          var scopes = new[] { "https://***.sharepoint.com/.default" };
          var authenticationResult = await app.AcquireTokenForClient(scopes).ExecuteAsync();
          return authenticationResult.AccessToken;
      }
    
      static async Task MainAsync(string[] args)
      {
          string site = "https://***.sharepoint.com/sites/CustomerServiceKB";
          string token = await GetToken();
          using (ClientContext context = new ClientContext(site))
          {
              context.ExecutingWebRequest += (s, e) =>
              {
                  e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + token;
              };
              Web web = context.Web;
              context.Load(web);
              context.ExecuteQuery();
          }
      }
    
      static void Main(string[] args)
      {
          try
          {
              AsyncContext.Run(() => MainAsync(args));
          }
          catch (Exception ex)
          {
              Console.Error.WriteLine(ex);
              throw;
          }
      }