Sharepoint Online 上禁止 WebRequest

Posted

技术标签:

【中文标题】Sharepoint Online 上禁止 WebRequest【英文标题】:WebRequest is forbidden on Sharepoint Online 【发布时间】:2019-01-24 09:06:13 【问题描述】:

我需要使用访问令牌在 SharePoint Online 中创建对特定页面的 Web 请求,以获取某些标头信息,但我不断收到 403,我不知道为什么。在处理了一些访问请求之后,我设法只使用 clientContext 获得 403,使用 Postman 获得 401。

我可以从我的应用程序中的 grah api 和使用访问令牌的邮递员获得响应,但问题是我需要执行 Web 请求来获取真正的网页标题,例如 SpRequestDuration 和 SPIISLatency。

我已按照步骤创建我的 Azure AD 和应用程序。 我请求用户登录以获取我的应用程序的验证码

loginScopes = [
'User.Read.All',
'Directory.Read.All',
'Group.Read.All',
'Sites.Read.All',
'Reports.Read.All' 
'offline_access',
'https://www.sharepoint.com/AllSites.FullControl'
];

const encodedScopes = encodeURIComponent(loginScopes.join(' '));
const encodedRedirectUri = encodeURIComponent(redirectUri);
let url = `https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?
response_type=code&
client_id=$clientId
&redirect_uri=$encodedRedirectUri
&scope=$encodedScopes
&prompt=select_account`;

在此返回身份验证代码后,我创建 ConfidentialClientApplication 权限为:'https://login.microsoftonline.com/organizations' 并使用我的应用程序 clientId、秘密、重定向等。使用新创建的 ConfidentialClientApplication 我在范围'tenantUrl/AllSites.FullControl'和具有其他范围的另一个令牌。

现在,我使用访问令牌成功创建了 ClientContext,它从共享点站点检索数据,我可以轻松地发出图形 API 请求,一切都会好起来的。但问题在于向特定站点创建 WebRequest(例如。tenantUrl/SitePages/Forms/ByAuthor.aspx)

var manager = new AuthenticationManager();
var clientContext = manager.GetAzureADAccessTokenAuthenticatedContext(tenantUrl, accessToken);
clientContext.Load(clientContext.Site);
clientContext.Load(oWebsite.Lists);
clientContext.ExecuteQuery(); // Works fine

var request = clientContext.WebRequestExecutorFactory.CreateWebRequestExecutor(clientContext,tenantUrl/SitePages/Forms/ByAuthor.aspx).WebRequest;

request.Method = "GET";
//request.Headers.Add("Authorization", $"Bearer accessToken");

clientContext.ExecutingWebRequest += delegate (object sender, WebRequestEventArgs e)

    e.WebRequestExecutor.WebRequest.Headers.Add("Authorization", "Bearer " + accessToken);
;
await request.GetResponseAsync(); // Throws 403

【问题讨论】:

【参考方案1】:

在线共享点

string siteUrl = ConfigurationManager.AppSettings["siteURL"];
SecureString passWord = new SecureString();
string pass = ConfigurationManager.AppSettings["userPassword"];
string user = ConfigurationManager.AppSettings["userName"];
foreach (char c in pass.ToCharArray()) passWord.AppendChar(c);
ClientContext clientContext = new ClientContext(siteUrl);
clientContext.Credentials = new SharePointOnlineCredentials(user, passWord);
return clientContext;

没有

clientContext.ExecutingWebRequest

【讨论】:

以上是关于Sharepoint Online 上禁止 WebRequest的主要内容,如果未能解决你的问题,请参考以下文章

从 SharePoint Online Web 部件调用外部服务

如何在 Sharepoint Online 上托管的 Access 自定义 Web 应用程序上编辑 CSS?

Sharepoint Online 突出显示的内容 Web 部件 - 显示文件子文件夹 CAML 查询

SharePoint Online 全宽页面

筛选 Web 部件不再在 Sharepoint Online 中可用

SharePoint Online - 内容编辑器 Web 部件 - 机密管理