我有一个相当简单的C#应用程序,它使用CSOM与SharePoint在线实例进行通信。这个工作正常,直到几个星期前,它在发布到Azure后停止工作(当从网络中的VS运行时,它在我的机器上仍能正常工作)。
我认为这个问题是由以下原因引起的:
ADFS阻止服务帐户从域外部登录
2FA阻止服务帐户进行身份验证,因为无法确认登录(2FA仅在登录网络时触发,因此仅在发布到Azure后才会发生)
为了尝试解决这个问题,我让管理员重置了帐户上的2FA并将其设置为已启用但未强制执行。
在account.activedirectory.windowsazure.com(需要)重新注册2FA后,我收到了一个名为应用程序密码的内容,据说可以用于服务帐户。
现在,在尝试运行应用时,我有2个场景:
使用普通帐户密码
登录名或密码与Microsoft帐户系统中的名称或密码不匹配。
使用新分配的应用密码
合作伙伴返回了错误的登录名或密码错误。有关更多信息,请参阅联合错误处理方案。
(请注意,密码肯定是正确的。我将它从配置文件中传入并跟踪到诊断日志以确保,并且在本地调试时,相同的密码可以100%工作)
我尝试按照2FA注册后的链接创建新的应用密码,但是当遇到MS登录屏幕时,我输入电子邮件地址并收到此消息
该帐户不存在。输入其他帐户或获取新帐户。
即使帐户能够登录到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);
}