1

System.Net.WebClient を使用して SharePoint リスト内のファイルにアクセスしようとしています。リストでは匿名アクセスが無効になっており (有効にすると機能します)、クレームベース認証を使用しています。SharePoint リスト内のファイルにアクセスする方法が他にもあることは知っていますが、これは、画像を生成するファイルの URL を渡す必要がある Office Web Apps Web サービスに対して行う呼び出しに関するものです。 . この URL で OWA Web サービスを呼び出しても、WebClient を介してファイルを直接ダウンロードしようとしても、同じエラーが発生します。

エラーは 403 禁止されています。いくつかのグーグル検索の結果、原因は何らかの形でクレームベース認証の使用に関連していると考えられます。提案された多くの救済策を試しましたが、これまでのところ何も機能していません. ブラウザを使用してファイルと Web サービスにアクセスでき、認証チャレンジを取得した後に機能します。意図的に認証チャレンジに失敗すると、(403 ではなく) 401 エラーが発生するため、資格情報に問題があるとは思いません (ハードコーディングするまでは行っています)。RunWithElevated Privileges でコードを実行しようとしましたが、役に立ちません。

サンプルコードは次のとおりです。

    使用 (var webClient = new WebClient())
    {
    webClient.UseDefaultCredentials = true;
    byte[] 結果 = webClient.DownloadData(urlOfFileInList);
    }

どんな助けでも大歓迎です!

4

2 に答える 2

1

WebClientを使用してクレームログインを実行する必要がある場合があります。これを開始点として使用できるかどうかを確認してください。

    using (var webClient = new WebClient()) {
        string url = "http://yoursite";
        string result = null;
        try {
            result = webClient.DownloadString(url);
        } catch (Exception ex) {
            if (ex.ToString().Contains("403")) {
                result = webClient.DownloadString(url + "/_forms/default.aspx");
                string viewstate = result.Substring(result.IndexOf("__VIEWSTATE") + 11);
                viewstate = viewstate.Substring(viewstate.IndexOf("value=\"") + 7);
                viewstate = viewstate.Substring(0, viewstate.IndexOf("\""));
                string eventvalidation = result.Substring(result.IndexOf("__EVENTVALIDATION") + 17);
                eventvalidation = eventvalidation.Substring(eventvalidation.IndexOf("value=\"") + 7);
                eventvalidation = eventvalidation.Substring(0, eventvalidation.IndexOf("\""));
                System.Collections.Specialized.NameValueCollection values = new System.Collections.Specialized.NameValueCollection();
                values.Add("__EVENTARGUMENT", "");
                values.Add("__EVENTTARGET", "");
                values.Add("__EVENTVALIDATION", eventvalidation);
                values.Add("__LASTFOCUS", viewstate);
                values.Add("__VIEWSTATE", "");
                values.Add("ctl00$PlaceHolderMain$signInControl$UserName", "");
                values.Add("ctl00$PlaceHolderMain$signInControl$login", "Sign In");
                values.Add("ctl00$PlaceHolderMain$signInControl$password", "");
                //byte[] data = webClient.UploadValues(url + "/_forms/default.aspx", "POST", values);
                //result = System.Text.Encoding.Default.GetString(data);
                //result = webClient.UploadString(url + "/_forms/default.aspx?__EVENTARGUMENT=&__EVENTTARGET=&__EVENTVALIDATION=" + 
                //    eventvalidation + "&__LASTFOCUS=&__VIEWSTATE=" + viewstate + 
                //    "&ctl00$PlaceHolderMain$signInControl$UserName=&ctl00$PlaceHolderMain$signInControl$login=Sign+In&ctl00$PlaceHolderMain$signInControl$password=", "");
                string location = webClient.ResponseHeaders["Location"];
                result = webClient.DownloadString(url);
            }
        }
    }
于 2011-01-15T05:32:28.167 に答える
0

SharePoint OM と WIF を使用すると、うまくいくでしょう。例はここにあります: http://www.shailen.sukul.org/2010/07/adfs-20-and-sharepoint-client-om.html

于 2011-01-15T06:42:57.297 に答える