クライアントオブジェクトモデルは、ログインしているユーザー - MVCアプリケーションになったときに401を与える
-
09-12-2019 - |
質問
私はクライアントOMを介してSharePoint 2010に接続するASP.NET MVCアプリを持っています。 ExecuteQuery()
を実行すると、SharePointからHTTP 401エラーが発生します。
ログインユーザーを偽装するようにMVCアプリを設定しています。
web.config(MVC Appの)の偽装設定:
<configuration>
<system.web>
<identity impersonate="true" />
</system.web>
</configuration>
.
コード:
Client Context ctx = new ClientContext("http://sharepoint.company.com/site");
ctx.Credentials = CredentialCache.DefaultNetworkCredentials;
Web web = ctx.Web;
ListCollection lists = web.Lists;
ctx.Load(web);
ctx.Load(lists);
ctx.ExecuteQuery();
.
例外:
System.Net.WebException:リモートサーバーはエラーを返しました:(401)無していません。 system.net.httpwebrequest.getResponse()で Microsoft.SharePoint.client.SpwebrequestExecutor.execute()で Microsoft.SharePoint.client.clientContext.ensureFormDigest()で Microsoft.SharePoint.client.clientContext.executeQuery()で mvcapp.services.SharePointService.getLibraries()
Web.configからの偽装設定を削除すると、Client OMはMVC AppのApp Poolアカウントを使用して接続します。これが起こると、接続は成功しました(App Poolアカウントのアクセス許可を付与した後)。また、
DefaultNetworkCredentials
を使用する代わりに、私がユーザー資格情報をハードコードすると、接続は同様に機能します。アプリはWindows認証用に設定されており、匿名認証はIISで無効になります。
試したこと:
- アプリプールアカウントが権限を委任できることを確認してください。
- 認証済みKerberos構成(いくつかの重複したSPNSを削除しました)
- 別のサーバーから接続します(私たちはSharePoint App Serverでこのアプリをホストしています)。このサーバーからの接続は、任意のSharePointインスタンスに接続できないことを意味します。別のサーバーからの接続を使用すると、このサーバー(QA)または当社の製造環境ではなく、DEV環境に接続できます。
SharePointへの接続時にクライアントOMにユーザー権限を委任するようにするために何ができますか?
更新
興味深いことに、私は同じ結果を持つ単純なWebRequestをSharePointに試しました。
.WebRequest request = WebRequest.Create("http://xxxxxxxxx"); request.Credentials = CredentialCache.DefaultNetworkCredentials; using(WebResponse response = request.GetResponse()) using(StreamReader reader = new StreamReader(response.GetResponseStream())) { return Content(reader.ReadToEnd(), "text/html"); }
解決
これはあなたが悪名高い
コードが対話しようとしているSharePointファーム内のマシンの1つで実行している場合は、2番目の 'Hop'を介して2番目の 'Hop'をスキップしてSharePointと直接対話することでこれを回避できます。Webサービスを通じてではなくサーバー。
他のヒント
ほぼ2年が経ちましたが、最近、SharePoint 2013に関する同じ問題がありました(実際にSP2013にSP 2010 CSOMライブラリを使用したSP2013にアクセスしました)。最後に私はそれを並べ替えていました。
まず、Kerberos認証が正しく機能していたとします。セーフ側にあるために、IIS設定でNTML認証をオフにするか、テストページに表示することもできます。
Thread.CurrentPrincipal.Identity.AuthenticationType
.
は交渉であるべきです。あなたが許可されているときに起こる可能性があるNTMLで実際にログオンするときに委任を試みることにはポイントはありません。
次にあなたの質問への更新。それは私をたくさん助けました、私たちはWebRequestを使った最も簡単な委任がうまくいかないとき、私たちはCSOMについて心配してはいけないことに気づいた。問題はこちらです。
と最後に、 s j 回答からのこの目立たないリンクは、実際に解決策を提供することができます - server の委任を許可する以外は委任を構成するすべてのステップを述べました。はい、あなたはの両方のの両方を信頼することを委任(述べた)およびこの特定のマシンの委任を信頼しなければなりません。
ともう1つの明白なこと - SharePoint自体はKerberos認証用に正しく設定される必要があります。
Webリクエストの委任が1回(例えば、開始ページのロード)、CSOMで同じことができます。私はそれをテストしました、魅力のように働きます。
差異は、2010 CSOMを搭載したSP2013を使用したこと、(2)は、要求全体ではなく特定のフラグメントのためだけに委任をオンにしました。
.
string ImpersonatedSpLogin = null, ImpersonatedSpMail = null;
WindowsIdentity identity = (WindowsIdentity)User.Identity;
using (var impersonationContext = identity.Impersonate())
{
using (ClientContext context = new ClientContext("http://myServer.somewhere.com/"))
{
context.Load(context.Web.CurrentUser);
context.ExecuteQuery();
ImpersonatedSpLogin = context.Web.CurrentUser.LoginName;
ImpersonatedSpMail = context.Web.CurrentUser.Email;
}
impersonationContext.Undo();
}
// now you can verify by checking ImpersonatedSpLogin and ImpersonatedSpMail
誰かを助けたい。
どこかに<authentication mode="Windows" />
もありますか?私はそれが必要であると信じています。
下のリンクには、web.configとiis の構成設定に基づいて、いくつかの変数の出力に関する情報がいくつかあります。
下記のリンクは役立ちますか?私も同様の問題に直面しています。