web-dev-qa-db-ja.com

リモートサーバーがエラーを返しました:(401)権限がありません。 ASP.NETでのCSOMの使用

私が作成したいくつかの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

何かアドバイスをいただければ幸いです!

ありがとうございました

8
Hidan

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

5
x0n

私のために働いたデフォルトの資格情報を使用する:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.UseDefaultCredentials = true;
4
Ricardo Rix

資格情報をコードで設定します。

SP.ClientContext context = new SP.ClientContext("MySPDevInstance");
context.Credentials = new NetworkCredential("username", "password");

これを構成ファイルに置いて、アプリケーションを公開または再コンパイルせずに変更する必要があります。

4
Fals

私が遭遇した設定をもう1つ追加するだけです。アカウントが特定のサーバーのみにアクセスするように制限されている場合は、クライアントマシンもそのアカウントに追加します。たとえば、WebアプリケーションがサーバーAでホストされていて、アカウントABCでサーバーBのSharePoint 2010に接続しようとしている場合は、そのアカウントがActive DirectoryのサーバーAにアクセスできることを確認します。通常、ADアカウントにはマシンに接続するための制限はありませんが、私の場合、アカウントは特定のマシンのみに制限されていました。私は自分のWebアプリケーションホストサーバーをアカウントに追加し、それが機能しました。

0
Ahmad Zia