Доступ к анонимной ссылке общего доступа из SharePoint в C# коде (и почтальоне) приводит к 403 - PullRequest
0 голосов
/ 21 февраля 2020

Мне поручено отправить по электронной почте некоторые файлы с нашего сайта SharePoint (не знаю версию или хостинг, но могу узнать). В качестве быстрого теста я получил доступ к одному из файлов, создал ссылку «Любой, у кого есть ссылка для просмотра» и вставил ее в код. Этот код возвращает 403.

То же самое со ссылкой на Dropbox работает как положено. Я убедился, что к файлу SP можно получить доступ за пределами нашей сети, с моего телефона, на персональном ноутбуке и т. Д. c, поэтому он фактически является анонимным. Очевидно, мне не хватает магического заголовка или чего-то еще. Я подозревал перенаправления, но после их получения я все равно получаю 403.

Причина, по которой мне нужна общая ссылка, заключается в том, что у нас есть "EmailService", который хочет URL для любых вложений. Это на самом деле тот код, который не работает, но я могу воспроизводить локально.

Это то, что делает служба:

private static void Download()
    {
        var webClient = new WebClient();
        var data = webClient.DownloadData("https://oursharepointaddy.com/:i:/s/blah/funkyShareurlhere?e=somestuffhere&download=1");
    }

При использовании F12 в Chrome, я заметил перенаправление так Я обработал это в коде ниже. Он с радостью следует за 302, затем БУМ, 403.

 private static void DownloadII()
    {
        var uri = $"https://oursharepointaddy.com/:i:/s/blah/funkyShareurlhere?e=somestuffhere&download=1";

        while (true)
        {
            var request = new HttpRequestMessage(HttpMethod.Post, uri);
            var handler = new HttpClientHandler {AllowAutoRedirect = false};
            var response = new HttpClient(handler).SendAsync(request).ConfigureAwait(false).GetAwaiter().GetResult();
            var statusCode = (int) response.StatusCode;

            if (statusCode >= 300 && statusCode <= 399)
            {
                var redirectUri = response.Headers.Location;
                if (!redirectUri.IsAbsoluteUri)
                {
                    redirectUri = new Uri(request.RequestUri.GetLeftPart(UriPartial.Authority) + redirectUri);
                }

                uri = redirectUri.AbsoluteUri;
                continue;
            }

            if (response.IsSuccessStatusCode)
            {
                var data = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult();
            }
        }
    }

Я также получаю 403 через Почтальона. Браузеры вроде бы в порядке. Даже в режиме инкогнито в Chrome ... нет проблем. Я пробовал различные заголовки (UserAgent и некоторые другие, которые я заметил в Chrome), добавил и удалил download=1. Я в тупике.

1 Ответ

0 голосов
/ 25 февраля 2020

Оказалось, что печенье. Перенаправление после l oop тоже не нужно. Просто скажите от HttpClientHander до UseCookies = true.

private static void DownloadIV()
    {
        var uri = "https://oursharepointaddy.com/:i:/s/blah/funkyShareurlhere?e=somestuffhere&download=1";
        var handler = new HttpClientHandler { AllowAutoRedirect = true, UseCookies = true };

        var request = new HttpRequestMessage(HttpMethod.Get, uri);

        var response = new HttpClient(handler).SendAsync(request).ConfigureAwait(false).GetAwaiter().GetResult();
        var statusCode = (int)response.StatusCode;

        if (response.IsSuccessStatusCode)
        {
            var data = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult();
            using (var stm = File.Create("downloaded.xlsx"))
            {
                data.Seek(0, SeekOrigin.Begin);
                data.CopyTo(stm);
            }
        }
    }

Для полноты, мой исходный код может выглядеть так же, как и ожидалось:

private static void DownloadII()
{
    var uri = $"https://oursharepointaddy.com/:i:/s/blah/funkyShareurlhere?e=somestuffhere&download=1";
    var handler = new HttpClientHandler {AllowAutoRedirect = false, UseCookies = true};
    while (true)
    {
        var request = new HttpRequestMessage(HttpMethod.Post, uri);
        var response = new HttpClient(handler).SendAsync(request).ConfigureAwait(false).GetAwaiter().GetResult();
        var statusCode = (int) response.StatusCode;

        if (statusCode >= 300 && statusCode <= 399)
        {
            var redirectUri = response.Headers.Location;
            if (!redirectUri.IsAbsoluteUri)
            {
                redirectUri = new Uri(request.RequestUri.GetLeftPart(UriPartial.Authority) + redirectUri);
            }

            uri = redirectUri.AbsoluteUri;
            continue;
        }

        if (response.IsSuccessStatusCode)
        {
            var data = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...