错误401使用Project Online和CSOM进行身份验证

时间:2015-09-02 13:06:45

标签: csom project-server ms-project-server-2013 project-web-access

尝试使用控制台应用程序中的CSOM连接到Project Online时,我收到错误401(或403)。 (这不是内部部署。它是Microsoft Project Online 2013.)以下是代码。

ProjectContext projContext = new ProjectContext(pwaPath);
projContext.Credentials = new NetworkCredential("myUserID", "mypwd", "xxx.onmicrosoft.com");
projContext.ExecutingWebRequest += new EventHandler<WebRequestEventArgs>(projContext_ExecutingWebRequest);
projContext.Load(projContext.Projects);
projContext.ExecuteQuery();
**// Error 401 Unauthorized**

static void projContext_ExecutingWebRequest(object sender, WebRequestEventArgs e)
{
    e.WebRequestExecutor.WebRequest.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
}

另一次尝试,没有ExecutingWebRequest:

ProjectContext projContext = new ProjectContext(pwaPath);
projContext.Credentials = new NetworkCredential("myUserID", "mypwd", "xxx.onmicrosoft.com");
projContext.Load(projContext.Projects);
projContext.ExecuteQuery();
**// Error 403 Forbidden**

Q1:代码有问题吗?

Q2:Project Online中是否存在我缺少的设置?

1 个答案:

答案 0 :(得分:2)

您可以使用:

new SharePointOnlineCredentials(username, secpassword);

而不是

new NetworkCredential("admin@myserver.onmicrosoft.com", "password");

首先:安装所需的客户端SDK

第二步:添加对项目的引用

  1. Microsoft.SharePoint.Client.dll
  2. Microsoft.SharePoint.Client.Runtime.dll
  3. Microsoft.ProjectServer.Client.dll
  4. 你可以在%programfiles%\Common Files\microsoft shared\Web Server Extensions\15\ISAPI找到dll 和%programfiles(x86)%\Microsoft SDKs\Project 2013\REDIST

    以下是示例代码:

    using System;
    using System.Security;
    using Microsoft.ProjectServer.Client;
    using Microsoft.SharePoint.Client;
    
    public class Program
    {
        private const string pwaPath = "https://[yoursitehere].sharepoint.com/sites/pwa";
        private const string username ="[username]";
        private const string password = "[password]";
        static void Main(string[] args)
        {
            SecureString secpassword = new SecureString();
            foreach (char c in password.ToCharArray()) secpassword.AppendChar(c);
    
    
            ProjectContext pc = new ProjectContext(pwaPath);
            pc.Credentials = new SharePointOnlineCredentials(username, secpassword);
    
            //now you can query
            pc.Load(pc.Projects);
            pc.ExecuteQuery();
            foreach(var p in pc.Projects)
            {
                Console.WriteLine(p.Name);
            }
    
            //Or Create a new project
            ProjectCreationInformation newProj = new ProjectCreationInformation() {
                Id = Guid.NewGuid(),
                Name = "[your project name]",
                Start = DateTime.Today.Date
            };        
            PublishedProject newPublishedProj = pc.Projects.Add(newProj);
            QueueJob qJob = pc.Projects.Update();
    
            JobState jobState = pc.WaitForQueue(qJob,/*timeout for wait*/ 10);
    
        }
    
    }
    

    我已经在其他问题上回答了这个问题 How to authenticate to Project Online PSI services?