我需要使用访问令牌在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`;
此命令返回身份验证代码后,我使用权限'https://login.microsoftonline.com/organizations'和我的应用程序clientId,secret,redirect等来创建ConfidentialClientApplication。使用新创建的ConfidentialClientApplication我以范围'{tenantUrl} /AllSites.FullControl静默获取令牌。 '和另一个具有其他作用域的令牌。
现在,使用访问令牌,我成功创建了ClientContext,它可以从Sharepoint站点检索数据,并且我可以轻松地发出图形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
答案 0 :(得分:0)
在线共享点
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