首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

不使用SharePointOnlineCredentials的Project Online CSOM

在使用Project Online的客户端对象模型(CSOM)时,如果你不想使用SharePointOnlineCredentials进行身份验证,可以选择其他身份验证方法,例如OAuth或Azure AD应用程序身份验证。以下是如何使用OAuth进行身份验证的示例。

前提条件

  1. 注册Azure AD应用程序:你需要在Azure AD中注册一个应用程序,并为其分配适当的权限。
  2. 获取客户端ID和客户端密钥:从Azure AD应用程序注册中获取客户端ID和客户端密钥。
  3. 获取租户ID:从Azure AD中获取租户ID。

步骤

1. 注册Azure AD应用程序

  • 登录到Azure门户。
  • 导航到“Azure Active Directory” > “应用注册” > “新注册”。
  • 输入应用程序名称,选择支持的帐户类型,并输入重定向URI(例如,https://localhost)。
  • 注册应用程序后,记下应用程序(客户端)ID和目录(租户)ID。
  • 导航到“证书和密码” > “新客户端密码”,生成一个新的客户端密码,并记下它。

2. 分配API权限

  • 导航到“API权限” > “添加权限” > “Microsoft Graph”或“SharePoint”。
  • 添加所需的API权限,例如“Sites.Read.All”、“Sites.ReadWrite.All”等。
  • 确保管理员同意这些权限。

3. 使用OAuth进行身份验证

以下是一个使用OAuth进行身份验证并访问Project Online的示例代码:

代码语言:javascript
复制
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Microsoft.Identity.Client;
using Microsoft.ProjectServer.Client;
using Microsoft.SharePoint.Client;

class Program
{
    private static string clientId = "YOUR_CLIENT_ID";
    private static string clientSecret = "YOUR_CLIENT_SECRET";
    private static string tenantId = "YOUR_TENANT_ID";
    private static string projectOnlineUrl = "https://YOUR_TENANT.sharepoint.com/sites/YOUR_PROJECT_SITE";

    static async Task Main(string[] args)
    {
        string authority = $"https://login.microsoftonline.com/{tenantId}";
        string[] scopes = { $"{projectOnlineUrl}/.default" };

        IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(clientId)
            .WithClientSecret(clientSecret)
            .WithAuthority(new Uri(authority))
            .Build();

        AuthenticationResult result = await app.AcquireTokenForClient(scopes).ExecuteAsync();

        using (var context = new ProjectContext(projectOnlineUrl))
        {
            context.ExecutingWebRequest += (sender, e) =>
            {
                e.WebRequestExecutor.WebRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
            };

            context.Load(context.Projects);
            context.ExecuteQuery();

            foreach (PublishedProject project in context.Projects)
            {
                Console.WriteLine($"Project Name: {project.Name}");
            }
        }
    }
}

解释

  1. Azure AD应用程序注册:在Azure AD中注册应用程序并获取客户端ID、客户端密钥和租户ID。
  2. 分配API权限:为应用程序分配所需的API权限。
  3. OAuth身份验证:使用Microsoft.Identity.Client库进行OAuth身份验证,获取访问令牌。
  4. 访问Project Online:使用获取的访问令牌访问Project Online数据。

依赖项

  • Microsoft.Identity.Client:用于OAuth身份验证。
  • Microsoft.ProjectServer.Client:用于Project Online CSOM。
  • Microsoft.SharePoint.Client:用于SharePoint CSOM。

你可以通过NuGet包管理器安装这些依赖项:

代码语言:javascript
复制
Install-Package Microsoft.Identity.Client
Install-Package Microsoft.ProjectServer.Client
Install-Package Microsoft.SharePoint.Client

通过这种方式,你可以在不使用SharePointOnlineCredentials的情况下,使用OAuth进行身份验证并访问Project Online。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Zorka监控平台Online reconfiguration使用方法

在Zorka这个页面中,介绍了其Online reconfiguration基本功能,简单来讲,这个功能支持在Application Server运行阶段重新加载配置文件、重新对必要文件进行插桩(...看起来这个功能蛮强大,这里仅仅介绍一下其基本使用方法: 将配置有ZorkaTomcat启动后,在JDKbin目录下启动jconsole.exe,连接Apache那个进程,然后点MBean——点开Zorka...前面的加号——ZorkaControl——点到最下层目录,可以看到有两个操作,其中一个是“listTracerIncludes”,点击右侧按钮,弹出窗口中有很多类似于:excl: 500: org.apache.juli.logging....*/*  (**)**, [a=0x0001,f=0x0809] 结果。....…… 也可以想象到,当然会影响JVM性能。 就简单总结这么多。

19010
  • 加速 Android 新版本广泛使用,我们来聊聊 Project Treble

    作者:Iliyan Malchev,Project Treble 项目负责人 Android P Beta (点击可直接跳转至相关文章) 已正式发布。...随着 Android 持续发展,每个新版本 OS (操作系统) 都会带来新功能、新用户体验以及更棒安全性能。这些新版本能够尽快应用在移动设备上是非常重要。...在这篇文章中,我们将谈一谈 Project Treble 项目和相关技术最新情况,以便让更多手机能够在年内支持 Android Beta 系统。...这一过程不仅仅意味着克服技术上挑战,更需要行业合作伙伴之间相互配合、通力合作。 为了降低技术层面上困难,我们发布 Project Treble 项目已包含在 Android Oreo 中。...为了让已经发布旧版本供应商实现能够运行较新版本 AOSP 框架,Project Treble 项目大幅度减少了对旧芯片持续投资需求,以支持各个版本 Android。

    55830

    Discourse 为什建议使用 Gmail SMTP

    最开始我们也用了 Gmail SMTP 服务。...这里有个问题是 Gmail 日发送邮件限制,很多人可能认为 Gmail 是没有日常发送邮件限制,通常不是这样,因为如果你是手工回复和发送邮件的话,这个限制还是很难达到。...如果是计算机或者网站使用 Gmail SMTP 的话,简单几个执行就会超过这个限制,测试下 SMTP 没有什么问题,但是真正运营的话,很快邮件就发不出去了。...一般来说比较大邮件发送,可能会考虑用 Gmail API,但 Gmail API 实在不是那么好用:Sending Email  |  Gmail API  |  Google Developers...为了图省事,并且还有邮件发送分析功能,个人感觉使用 MailGun 或者其他第三方服务要稳定不少。

    55130

    选择使用Lucene6大原因

    选择使用Lucene6大原因      Lucene是开放源代码全文搜索引擎工具包,凭借着其强劲搜索功能和简单易用实现,在国内已经很普及,甚至一度出现了言搜索必称Lucene盛景...; 第三类是以中文分词为中心介绍;      任何一个软件,包括所有伟大软件都有这样或者那样“缺点”和各自适用领域,Lucene也例外。...并不是想象那么棒 文章:Champeau 开门见山指出了Lucene6大不足之处,鉴于 Lingway 公司使用Lucene已有好几年历史,我相信Cedric Champeau对Lucene评论还是值得一读...选择使用Lucene6大原因: 6、Lucene 内建不支持群集。         Lucene是作为嵌入式工具包形式出现,在核心代码上没有提供对群集支持。...实现对Lucene群集有三种方式:1、继承实现一个 Directory;2、使用Solr 3、使用 Nutch+Hadoop;使用Solr你不得不用他Index Server ,而使用Nutch你又不得不集成抓取模块

    1.2K20

    Discourse 为什建议使用 Gmail SMTP

    最开始我们也用了 Gmail SMTP 服务。...这里有个问题是 Gmail 日发送邮件限制,很多人可能认为 Gmail 是没有日常发送邮件限制,通常不是这样,因为如果你是手工回复和发送邮件的话,这个限制还是很难达到。...如果是计算机或者网站使用 Gmail SMTP 的话,简单几个执行就会超过这个限制,测试下 SMTP 没有什么问题,但是真正运营的话,很快邮件就发不出去了。...一般来说比较大邮件发送,可能会考虑用 Gmail API,但 Gmail API 实在不是那么好用:Sending Email  |  Gmail API  |  Google Developers...为了图省事,并且还有邮件发送分析功能,个人感觉使用 MailGun 或者其他第三方服务要稳定不少。

    80810

    使用ElementUIMessage起效果解决办法

    最近,遇见了使用ElementUIMessage起效果,这本来是个很简单问题,但是控制台一直在报错scope没有定义。...我解答思路: 1.首先是确定Meaage有没有全局引用,于是就去main.js添加引用Message; (但是其他页面message都能正常弹出,因此肯定全局已经引入) 2.看子页面的代码,...看它点击确定按钮方法,传入参数是否正确; 看插槽使用是否正确,还使用了匿名函数,将scope传了进去,但是没有作用; 3.但是不是插槽写错,也不是没有传入参数原因,而是message少写了一个...为此还专门请教了以前同事,还专门去看了一下插槽知识;因此好好学习知识有多重要,并且一定不要粘贴复制,而是要很熟悉! 源代码 下面才是正确书写方式,非常简单!

    32610

    ​一些规范GTID使用场景

    这是学习笔记第 1987 篇文章 GTID是一种很不错复制解决方案,但是在使用中还是碰到一些问题,经过整理我梳理了如下一些规范GTID使用场景 l 从库可写 如果在从库端写入了数据,GTID_Set...就包含两个源,在使用中可能会混淆,比较规范方式是对从库开启只读模式,如果碰到数据修复场景,我们可以使用sql_log)bin=0来临时修复。...l 复制模式为MASTER_AUTO_POSITION =0 如果我们开启了GTID,还是建议使用GTID协议数据复制方式,如果依旧使用偏移量复制方式,在主从切换时候很容易出问题。...同时,在一些特殊数据修复场景中,我们使用change master to xxx,master_auto_position=0; 配置复制关系时,语句不带relay_log_file和relay_log_pos...但是建议在线做这样操作,一来是维稳,因为这种操作频率是很低排除有一些复杂bug,二来是对于配置GTID应该是统一规划,反复变化说明管理是混乱,一般建议在参数文件中配置后启动数据库。

    51020

    我为什么建议使用框架默认 DefaultMeterObservationHandler

    我为什么建议使用框架默认 DefaultMeterObservationHandler 背景知识 最近,我们升级了 SpringBoot 3.x,并且,升级后,我们全面改造了原来 Sleuth 以及...全面使用 Observation 遇到了内存溢出以及 CPU 飙高(非不断 GC 导致) 但是,我们在全面使用 Observation 时候,发现了一个问题,就是内存溢出以及 CPU 飙高(非不断 GC...>UTF-8 <!...为何会出现内存溢出 我们通过增加如下启动参数启动并且在退出时候 dump JFR: -XX:StartFlightRecording=disk=true,dumponexit=true 或者使用下面的参数在内存溢出时候...解决方案 我们可以替换掉 DefaultMeterObservationHandler,自己实现一个 MeterObservationHandler,在 start 时候,创建 LongTaskTimer.Sample

    8600

    规范使用ThreadLocal导致bug,说多了都是泪

    ThreadLocal一般用于线程间数据隔离,通过将数据缓存在ThreadLocal中,可以极大提升性能。但是,如果错误使用Threadlocal,可能会引起不可预期bug,以及造成内存泄露。...也就是说,线程是可能被重用,如果线程一旦被重用,而ThreadLocal数据没有及时重置,就会导致数据被混乱使用。...,我们将servlet.tomcat.threads.max设置为1,这样每次请求使用都是同一个线程。...这就是因为没有及时重置ThreadLocal导致数据错误。正确使用姿势修正办法就是处理完接口之后要及时清理ThreadLocal。...其实,我们可以使用拦截器或者过滤器自动帮我们完成数据初始化以及清理工作。最后我们在写业务代码时,正确理解线程全生命周期以及执行原理,对我们提升代码健壮性其实很有帮助。

    53920

    聊聊因恰当使用alibaba sentinel而踩到

    今天就来聊聊因恰当使用alibaba sentinel,而导致熔断降级失效一些例子。因为sentinel还在不断迭代更新中,不同版本会有一些差异,而且在版本迭代中,有些问题可能也已经修复。...本文演示版本使用sentinel-dashboard是1.8.0。...使用springcloud alibaba版本为2.2.3.RELEASE 失效场景例子 1、降级生效问题 a、原因分析 项目中使用了自定义全局异常处理,而异常数或者异常比例统计在 com.alibaba.csp.sentinel.adapter.spring.webmvc.AbstractSentinelInterceptor.afterCompletion...System.out.println(String.format("msg : %s",msg)); return AjaxResult.success("测试热点规则"); } 总结 本文主要介绍了常见使用...alibaba sentinel可能遇到问题,不得说下阿里在国内开源做真的挺好,大部分问题在官方issue都能找到解答 文章下方demo链接,提供其他熔断降级例子以及基于文件持久熔断降级配置功能例子

    1.5K20

    聊聊因恰当使用alibaba sentinel而踩到

    今天就来聊聊因恰当使用alibaba sentinel,而导致熔断降级失效一些例子。因为sentinel还在不断迭代更新中,不同版本会有一些差异,而且在版本迭代中,有些问题可能也已经修复。...本文演示版本使用sentinel-dashboard是1.8.0。...使用springcloud alibaba版本为2.2.3.RELEASE 02 失效场景例子 降级生效问题 A 原因分析 项目中使用了自定义全局异常处理,而异常数或者异常比例统计在 com.alibaba.csp.sentinel.adapter.spring.webmvc.AbstractSentinelInterceptor.afterCompletion...System.out.println(String.format("msg : %s",msg)); return AjaxResult.success("测试热点规则"); } 03 总结 本文主要介绍了常见使用...alibaba sentinel可能遇到问题,不得说下阿里在国内开源做真的挺好,大部分问题在官方issue都能找到解答 文章下方demo链接,提供其他熔断降级例子以及基于文件持久熔断降级配置功能例子

    1K20

    为什么建议使用 Java 自带序列化?

    但是在提供很用户简单调用同时他也存在很多问题: 1、无法跨语言 当我们进行跨应用之间服务调用时候如果另外一个应用使用c语言来开发,这个时候我们发送过去序列化对象,别人是无法进行反序列化因为其内部实现对于别人来说完全就是黑盒...2、序列化之后码流太大 这个我们可以做一个实验还是上一节中Message类,我们分别用java序列化和使用二进制编码来做一个对比,下面我写了一个测试类: @Test public void testSerializable...byte[] result = new byte[buffer.remaining()]; buffer.get(result); System.out.println("使用二进制序列化长度...result = new byte[buffer.remaining()]; buffer.get(result); /*System.out.println("使用二进制序列化长度...结合以上我们看到: 目前序列化过程中使用 Java 本身肯定是不行,使用二进制编码的话又我们自己去手写,所以为了让我们少搬砖前辈们早已经写好了工具让我们调用,目前社区比较活跃有 google

    64630

    使用数据集和多数据集会影响运算

    首先想知道多数据集和未使用数据集影响运算,我们需要先了解设计器是怎么运算,皕杰报表brt文件在服务端是由servlet解析,其报表生成运算顺序是:变量参数运算-->数据集取数及运算-->报表运算及扩展...,前面的步骤未走完,是不会往下进行运算。无论报表里是否用到了这个数据集,报表工具都要先完成数据集取数和运算再进行报表运算,因而,如果数据集发生卡滞,整个报表就不能运算了。...皕杰报表中影响数据集取数因素主要包括,数据库JDBC驱动匹配,取数据sql不正确或不够优化,数据量太大占用内存过多。...1、数据库JDBC驱动是由数据库厂家配套,不仅与数据库版本相关,还与jdk版本相关,JDBC驱动匹配就不能从数据库正常取数了。...如皕杰报表6.0运行环境是JDK1.8,如JDBC驱动不支持JDK1.8就不能正常取数。2、取数据sql可放到数据库客户端上先行运行测试,以确保取数sql正确。

    1.3K90

    数据库推荐使用外键9个理由

    来源:www.jdon.com/49188 我经验告诉我,很多数据库(大多数我曾经使用包含外键时并不总是一件坏事。在这篇文章中,我想把重点放在为什么原因上。 为什么这是一个问题?...这仅仅是我在各种渠道(主要是互联网论坛)都能找到许多开发人员、架构师为什么不使用它们理由。我个人(和许多其他经验丰富数据库专家)建议在任何可能地方使用它们(不会导致更多问题)。...4.更高层次框架 一些应用程序使用编程框架,在物理数据库之上创建另一个逻辑层。开发人员不使用插入或更新语句来修改数据,而使用API或者框架在后台执行所有操作。...这些框架可以自己创建数据库表,而总是创建外键。使用这些工具开发人员很少会干扰自动生成模式,并且不需要外键。...这需要一些努力,但是却没有带来直接好处。一些架构师和数据库管理员只是忽略了这一部分。 9.保持模型秘密 也许这是一个很遥远问题,但也许有时候是因为人们希望别人知道太多太容易。

    2.1K10

    Go: 命名返回值使用, return携带还是携带?

    在Go语言中,命名返回值提供了一种声明函数返回值方式,它可以增加代码可读性和灵活性。但是,在使用命名返回值时,return语句是否应该明确携带返回值,是一个常见困惑。...带命名返回值return 如果在函数中使用了命名返回值,你可以在return语句中明确指定返回值,如下所示: func sum(a, b int) (result int) { result =...建议做法 对于简单函数,可以考虑省略return语句中返回值,使代码更精简。 对于复杂函数或重要库,可能更适合明确指定返回值,以增加代码可读性和可维护性。...总结 命名返回值在Go语言中是一个强大工具,但如何使用它没有固定规则。选择是否在return语句中携带返回值取决于多个因素,包括代码复杂性、团队编程风格以及可读性和可维护性需求。...最终建议是,无论选择哪种方式,都应该追求代码清晰、一致和有良好文档支持。 希望这篇文章能帮助你解决关于Go语言中命名返回值使用困惑。

    39530

    数据库推荐使用外键 9 个理由

    让我们来看看数据库可以没有外键原因。首先一个简短免责声明(因为文章引发了一些关于LinkedIn群体争议): 下面的理由绝不鼓励不要在数据库中使用外键约束。...这仅仅是我在各种渠道(主要是互联网论坛)都能找到许多开发人员、架构师为什么不使用它们理由。我个人(和许多其他经验丰富数据库专家)建议在任何可能地方使用它们(不会导致更多问题)。...4.更高层次框架 一些应用程序使用编程框架,在物理数据库之上创建另一个逻辑层。开发人员不使用插入或更新语句来修改数据,而使用API或者框架在后台执行所有操作。...这些框架可以自己创建数据库表,而总是创建外键。使用这些工具开发人员很少会干扰自动生成模式,并且不需要外键。...这需要一些努力,但是却没有带来直接好处。一些架构师和数据库管理员只是忽略了这一部分。 9.保持模型秘密 也许这是一个很遥远问题,但也许有时候是因为人们希望别人知道太多太容易。

    1.7K30
    领券