MSAL AD令牌对SharePoint Online CSOM无效 [英] MSAL AD token not valid with SharePoint Online CSOM

查看:11
本文介绍了MSAL AD令牌对SharePoint Online CSOM无效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能够在桌面.NET项目中通过MSAL检索和使用访问令牌。我可以成功检索令牌,并且它们在我的Graph调用中有效。

但是,尝试将访问令牌与SharePoint Online CSOM一起使用时,会出现401:AURTHIZED。这类似于accessing sharepoint REST apis using msal throws 401(除了我使用的是C#和最新的CSOM)。

我的理解是,MSFT正在尝试将DEV从ADAL移至MSAL,但令牌似乎存在一些兼容性问题。

是否有人能够指定必要的作用域并利用来自MSAL的具有不记名授权的OAuth令牌来访问SharePoint Online?

推荐答案

据我所知,您不能通过AAD请求带有客户端/机密令牌的SharePoint rest API。但它需要证书才能工作。下面是一步一步:

因为我也面临着同样的问题,我将在这里发布我是如何通过带有MSAL的AAD应用程序(OAuth v2和AAD v2端点)连接到SharePoint API的。它是用C#编写的。

首先,我仅使用证书成功(据我所知,客户端/加密方法不起作用)。

创建证书

出于测试目的,我使用New-PnPAzureCertificate创建了一个自签名证书,如下所示:

$secPassword = ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force
$cert = New-PnPAzureCertificate -OutCert "CertSPUser.cer" -OutPfx "CertSPUser.pfx" -ValidYears 10  -CertificatePassword $secPassword -CommonName "CertSPUser" -Country "FR" -State "France"

(-Country-State参数对测试无关紧要)

(它也适用于New-SelfSignedCertificate命令)

注册证书

然后,您必须将证书上载到您的AAD应用程序(";.ercer";文件)中:

配置应用程序API权限

之后,您必须授权SharePoint API:

尝试通过守护应用程序访问(C#)

NuGet包(希望我没有忘记)

  • Microsoft.SharePointOnline.CSOM
  • Microsoft.Identity.Client

要让它工作,你必须用3个步骤(我已经简化了它,但你最好用一些try/Catch将动作分成几个方法)

获取PFX证书

对于这一步,我强烈建议使用KeyVault(请参阅帖子底部的链接)

string certPath = System.IO.Path.GetFullPath(@"C:PathToCertSPUser.pfx");
X509Certificate2 certificate = new X509Certificate2(certPath, "MyPassword", X509KeyStorageFlags.MachineKeySet);

获取令牌

string tenantId = "yourTenant.onmicrosoft.com" // Or "TenantId"
string applicationId = "IdOfYourAADApp"
IConfidentialClientApplication confApp = ConfidentialClientApplicationBuilder.Create(applicationId)
.WithAuthority($"https://login.microsoftonline.com/{tenantId}")
.WithCertificate(certificate)
.Build();

string sharePointUrl = "https://yourSharePoint.sharepoint.com" // Or "https://yourSharePoint-admin.sharepoint.com" if you want to access the User Profile REST API
var scopes = new[] { $"{sharePointUrl}/.default" };
var authenticationResult = await confApp.AcquireTokenForClient(scopes).ExecuteAsync();
string token = authenticationResult.AccessToken;

测试您的连接

ClientContext ctx = new ClientContext(sharePointUrl);
ctx.ExecutingWebRequest += (s, e) =>
{
      e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + token;
};

Web web = ctx.Web;
ctx.Load(web);
ctx.Load(web);
ctx.ExecuteQuery();

// OR if you connect to User Profile ("yourSharePoint-admin.sharepoint.com")
/* 
PeopleManager peopleManager = new PeopleManager(ctx);
var personProperties = peopleManager.GetUserProfileProperties("i:0#.f|membership|employee.mail@tenant.onmicrosoft.com");
ctx.ExecuteQuery();
*/

如果我没有错过任何内容,您应该会得到一些网站/用户信息!😉

希望它能有所帮助。

编辑(2020年11月14日):即使在API权限上的屏幕截图中添加了应用程序权限User.ReadWrite.All,如果您尝试更新用户配置文件,它也不会起作用。要解决此问题,您必须将您的AAD应用程序注册为旧版的SharePoint App-Only主体(客户端ID/密码)。更多信息here

感谢@laurakokkarinen@mmsharepoint的文章真正帮助了我(herehere)

这篇关于MSAL AD令牌对SharePoint Online CSOM无效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆