私が作成したいくつかのSharePoint 2013リストデータをプルしようとしましたが、自分のマシンでローカルに実行し、サーバーでローカルに実行すると正常に機能します。サーバーでローカルとローカルの両方を実行しているときに、同じ資格情報を使用しています。問題は、サーバー上のASP.NETアプリを公開してそこに移動すると、「リモートサーバーがエラーを返しました:(401)Unauthorized」と表示されます。エラー...
私は、stackoverflowに関するたくさんの投稿とWeb上の他のいくつかの記事を見てきました
これは、コンテキストがIUSRを使用しているように見えることを示しています: http://blogs.msdn.com/b/sridhara/archive/2014/02/06/sharepoint-2013-csom-call-from-web- part-fails-with-401-for-all-users.aspx
これは、デフォルトのネットワーク認証情報を設定しようとすることについて言及しています: https://sharepoint.stackexchange.com/questions/10364/http-401-unauthorized-using-the-managed-client-object-model
私は記事に記載されている修正を使用してみただけでなく、コンテキストがDefaultNetworkCredentialsを使用するように強制しようとしましたが、うまくいきませんでした。マシンではなく、ログインしたユーザーの認証情報をアプリで使用したいと思います...
これが私が使っているコードです:
SP.ClientContext context = new SP.ClientContext("MySPDevInstance");
context.Credentials = CredentialCache.DefaultNetworkCredentials;
Entity entity = context.Web.GetEntity(collectionNamespace, collectionName);
LobSystem lobSystem = entity.GetLobSystem();
LobSystemInstanceCollection lobSystemInstanceCollection = lobSystem.GetLobSystemInstances();
context.Load(lobSystemInstanceCollection);
context.ExecuteQuery();
LobSystemInstance lobSystemInstance = lobSystemInstanceCollection[0];
FilterCollection filterCollection = entity.GetFilters(filter);
filterCollection.SetFilterValue("LimitFilter", 0, 1000);
EntityInstanceCollection items = entity.FindFiltered(filterCollection, filter, lobSystemInstance);
サーバーは実行中IIS 6.0
何かアドバイスをいただければ幸いです!
ありがとうございました
ASP.NET WebサイトがWindows統合(NTLM)認証を使用していると思います。この方法で認証されたユーザーは、サーバー側(Webサーバー)から2番目の場所を認証できません。NTLMの "ダブルホップ"(1)制限と呼ばれるものを経験しています。サーバー側で専用アカウントを使用する必要があります。または、ログインしたユーザーのIDを本当に使用したい場合は、Kerberosなどの委任を許可する認証スキームを使用する必要があります。
SharePointデータにアクセスするためにユーザーのIDが本当に必要で、認証スキームを変更できない場合、これを行うための最良の方法は、JavaScript CSOMを使用することです。これは、ユーザーがSharePointサーバー(ダブルではなくシングルホップ)に対して直接認証を行い、ASP.NETサイトがこのスクリプトを含むページをユーザーに提供することを意味します。
(1) http://blogs.msdn.com/b/knowledgecast/archive/2007/01/31/the-double-hop-problem.aspx
私のために働いたデフォルトの資格情報を使用する:
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.UseDefaultCredentials = true;
資格情報をコードで設定します。
SP.ClientContext context = new SP.ClientContext("MySPDevInstance");
context.Credentials = new NetworkCredential("username", "password");
これを構成ファイルに置いて、アプリケーションを公開または再コンパイルせずに変更する必要があります。
私が遭遇した設定をもう1つ追加するだけです。アカウントが特定のサーバーのみにアクセスするように制限されている場合は、クライアントマシンもそのアカウントに追加します。たとえば、WebアプリケーションがサーバーAでホストされていて、アカウントABCでサーバーBのSharePoint 2010に接続しようとしている場合は、そのアカウントがActive DirectoryのサーバーAにアクセスできることを確認します。通常、ADアカウントにはマシンに接続するための制限はありませんが、私の場合、アカウントは特定のマシンのみに制限されていました。私は自分のWebアプリケーションホストサーバーをアカウントに追加し、それが機能しました。