私はsharepoint REST APIを使用するデモアプリケーションを作成しています。ベアラトークンを(クライアントIDと証明書で)正常に取得できました。 AppはAzure ADに登録されており、チェックされているすべてのSharepoint権限があります。たとえば、すべてのリストを取得できますが、ファイルを取得できません。ブラウザで同じクエリが機能します。私はそれが許可の問題だと思う。このアプリをSPに登録する必要がありますか? https://tenant.sharepoint.com/IT/_layouts/15/appinv.aspx
私は成功しなかったが、Azure ADのパーミッションで十分だと思う。私のGETクエリが返されますSharepoint - ADAL OAuth - ファイルが存在しません
{"error":{"code":"-2130575338, Microsoft.SharePoint.SPException","message":{"lang":"en-US","value":"The file /IT/vystupnidokumentydoc/filename.docx does not exist."}}}
ユーザコンテキストでブラウザで同じクエリがOKです。
REST呼び出し:
private async static Task DoStuffInOffice365(string token)
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
client.DefaultRequestHeaders.Add("Accept", "application/json; odata = verbose");
string url;
url = "https://tenant.sharepoint.com/_api/web/GetFileByServerRelativeUrl('/IT/vystupnidokumentydoc/filename.docx')";
using (HttpResponseMessage response = await client.GetAsync(url))
{
var contents = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
Console.WriteLine("Fail!");
else
Console.WriteLine("OK.");
}
}
は、トークンを取得:エラーメッセージに基づいて
private async static Task<string> GetAccessToken()
{
//authentication context
string authority = "https://login.windows.net/tenant.onmicrosoft.com/";
AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);
var certPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
certPath = certPath.Substring(0, certPath.LastIndexOf('\\')) + $"\\{CERT_FILE}";
var certfile = System.IO.File.OpenRead(certPath);
var certificateBytes = new byte[certfile.Length];
certfile.Read(certificateBytes, 0, (int)certfile.Length);
var cert = new X509Certificate2(
certificateBytes,
PRIVATE_KEY_PASSWORD,
X509KeyStorageFlags.Exportable |
X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.PersistKeySet);
ClientAssertionCertificate cac = new ClientAssertionCertificate(CLIENT_ID, cert);
var authenticationResult = await authenticationContext.AcquireTokenAsync(P_URL, cac);
return token = authenticationResult.AccessToken;
}
ファイルが実際に存在します。私は同じURLのブラウザ(ユーザーコンテキスト)でそれを取得することができます。私は自分のアプリからリストや他のREST操作にアクセスできます。ファイルのみに問題があります。 –