不可能的错误会根据使用的密码而变化

时间:2018-06-04 01:20:54

标签: c# azure sharepoint office365 csom

我有一个相当简单的C#应用​​程序,它使用CSOM与SharePoint在线实例进行通信。这个工作正常,直到几个星期前,它在发布到Azure后停止工作(当从网络中的VS运行时,它在我的机器上仍能正常工作)。

我认为这个问题是由以下原因引起的:

  1. ADFS阻止服务帐户从域外部登录

    • 我觉得这不太可能,因为自应用程序运行以来ADFS设置没有任何变化。
  2. 2FA阻止服务帐户进行身份验证,因为无法确认登录(2FA仅在登录网络时触发,因此仅在发布到Azure后才会发生)

    • 我认为这更有可能是culrpit。
  3. 为了尝试解决这个问题,我让管理员重置了帐户上的2FA并将其设置为已启用但未强制执行

    account.activedirectory.windowsazure.com(需要)重新注册2FA后,我收到了一个名为应用程序密码的内容,据说可以用于服务帐户。

    现在,在尝试运行应用时,我有2个场景:

    1. 使用普通帐户密码

        

      登录名或密码与Microsoft帐户系统中的名称或密码不匹配。

    2. 使用新分配的应用密码

        

      合作伙伴返回了错误的登录名或密码错误。有关更多信息,请参阅联合错误处理方案。

    3. 这些错误有什么区别?

      (请注意,密码肯定是正确的。我将它从配置文件中传入并跟踪到诊断日志以确保,并且在本地调试时,相同的密码可以100%工作)

      我尝试按照2FA注册后的链接创建新的应用密码,但是当遇到MS登录屏幕时,我输入电子邮件地址并收到此消息

        

      该帐户不存在。输入其他帐户或获取新帐户。

      enter image description here

      即使帐户能够登录到sharepoint实例,并且从我的计算机调试时代码也能正常运行

      神的名字在这里发生了什么?

      根本不是很有用,但这是抛出错误的代码示例(在Executequery上):

      using (var clientContext = new ClientContext(baseUrl))
      {
          clientContext.Credentials = credentials;
      
          var web = clientContext.Web;
          var list = clientContext.Web.SiteUserInfoList;
          var users = list.GetItems(new CamlQuery());
      
          clientContext.Load(users, includes => includes.Include(
              f => f["GUID"],
              f => f["FirstName"],
              f => f["LastName"],
              f => f["UserName"],
              f => f.DisplayName));
      
          try
          {
              clientContext.ExecuteQuery();
          }
          catch (Exception e)
          {
              Trace.TraceError(e.Message);
              Trace.TraceError(e.StackTrace);
              throw;
          }
      }
      

      凭据是在构造函数

      中构建的
      public SPClient(string url, string username, string password)
      {
          baseUrl = url;
          Trace.TraceInformation(username);
          Trace.TraceInformation(password);
      
          var securePassword = new SecureString();
          foreach (var c in password)
          {
              securePassword.AppendChar(c);
          }
          credentials = new SharePointOnlineCredentials(username, securePassword);
      }
      

0 个答案:

没有答案