gpt4 book ai didi

sharepoint-online - MSAL AD token 对 SharePoint Online CSOM 无效

转载 作者:行者123 更新时间:2023-12-04 12:07:53 29 4
gpt4 key购买 nike

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

但是,尝试将访问 token 与 SharePoint Online CSOM 一起使用会导致 401:未经授权。这类似于 accessing sharepoint REST apis using msal throws 401 (除了我使用 C# 和最新的 CSOM)。

据我了解,MSFT 正试图将开发人员从 ADAL 转移到 MSAL,但 token 似乎存在一些兼容性问题。

是否有人能够指定必要的范围并利用来自 MSAL 的不记名授权的 OAuth token 来访问 SharePoint Online?

最佳答案

据我所知,您不能通过 AAD 使用客户端/ secret token 请求 SharePoint REST API。但它适用于证书。下面一步一步来:
由于我面临同样的问题,我将在此处发布我如何通过带有 MSAL(OAuth v2 和 AAD v2 端点)的 AAD 应用程序连接到 SharePoint API。它在 C# 中。
首先,我只获得了证书(据我所知,客户端/ secret 方法不起作用)。
创建证书
出于测试目的,我创建了一个带有“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 应用程序(“.cer”文件)中上传证书:
image
配置应用程序 API 权限
之后,您必须授权 SharePoint API:
image
尝试通过 Daemon App (C#) 访问
NuGet 包(希望我什么都没有忘记)
  • Microsoft.SharePointOnline.CSOM
  • Microsoft.Identity.Client

  • 为了使事情发挥作用,您必须分 3 个步骤(我已经对其进行了简化,但您最好将这些操作分离为具有一些 try/catch 的方法)
    获取 Pfx 证书
    对于这一步,我强烈建议使用 KeyVault(请参阅帖子底部的链接)
    string certPath = System.IO.Path.GetFullPath(@"C:\PathTo\CertSPUser.pfx");
    X509Certificate2 certificate = new X509Certificate2(certPath, "MyPassword", X509KeyStorageFlags.MachineKeySet);
    获取 token
    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();
    */
    如果我没有错过任何东西,您应该会得到一些网络/用户信息! 😉
    希望它有帮助。
    编辑 (11/14/2020) :即使在 API 权限的屏幕截图中我添加了应用程序权限“User.ReadWrite.All”,如果您尝试更新用户配置文件,它也不会起作用。要解决此问题,您必须将 AAD 应用程序注册为旧版 SharePoint App-Only 主体(客户端 ID/ secret )。更多信息 here .
    感谢 @laurakokkarinen@mmsharepoint他们的文章对我很有帮助( herehere )

    关于sharepoint-online - MSAL AD token 对 SharePoint Online CSOM 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54771270/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com