0

このカスタムWCFRESTサービスは、Windows認証を使用してSharepoint2010アプリケーション内でホストされています。

このサービスを.NETプロジェクト(つまり、コンソールプロジェクト)で使用する必要がありますが、クレデンシャルが私を夢中にさせています。たくさんの400 - bad requestまたは401 - unauthorized応答があります(認証を含めるかどうかによって異なります)。

例を挙げましょう:

siteUriはSPサイト(ルート/ホームページ)methodUriのURLであり、XMLを返すサービスメソッドのURLです。

繰り返しになりますが、このサイトはWindows認証されています。ブラウザを開いてに移動すると、次のようmethodUriになります。

リクエストエラー

サーバーでリクエストの処理中にエラーが発生しました。詳細については、サーバーログを参照してください。

しかし、次に移動するsiteUriと、Sharepointホームページが読み込まれ、methodUri再度参照できるようになり、XML応答が正しく取得されます。

したがって、ホームページを参照すると、Webメソッドにリクエストを送信するときに使用されるCookieがいくつか保存されているようです。Fiddlerでリクエストを確認すると、これを確認できます。

最初のmethodUriリクエストはコードで失敗し400、リクエストヘッダーにCookieが含まれていません。次に、ホームページ(siteUri)を参照すると、認証自体のように見えるいくつかの要求/応答があります。応答ヘッダーには次のものが含まれます。

WWW-Authenticate: Negotiate oRswGaADCgEAoxIEEAEAAABDh+CIwTbjqQAAAAA=
Set-Cookie: WSS_KeepSessionAuthenticated={b89d78b2-063d-4ac4-810e-bde4e04a829e}; path=/
Persistent-Auth: true

そして最後に、methodUriもう一度参照すると、最初の応答は401-Unauthorizedですが、その直後にこのヘッダーを含む別のリクエストがあります

Cookie: WSS_KeepSessionAuthenticated={b89d78b2-063d-4ac4-810e-bde4e04a829e}
Authorization: Negotiate oXcwdaADCgEBoloEWE5UTE1TU1AAAwAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAABXCiOIGAbEdAAAAD37/i76Dl3jNyK8bIRz57fmjEgQQAQAAAPUXp1AtIpqEAAAAAA==

最終的に受け入れられ、サービスは対応するXMLで応答します。

したがって、ブラウザは、現在のWindowsユーザーを認証するためにこの前後の要求/応答を処理するのに十分スマートです。

私の問題は、.NET(3.5または4)でこれを行うにはどうすればよいですか。ただし、defautlクレデンシャルを使用せずに、ユーザー名、pwd、およびドメインを指定する必要があります。

これに対処するために5日間を費やし、HttpWebRequestのデフォルトのネットワーククレデンシャルを使用して機能させることができましたが、クレデンシャルを手動で設定すると(現在ログインしているユーザーと同じものを使用して)機能しません。

私はオープンソース(ruby、python)のバックグラウンドを持っており、この種のことは非常に簡単なので、このすべてが不必要に複雑になりすぎていることに気付きます(Microsoftに感謝します)。

追加情報が必要な場合は、お問い合わせください。私はこれに対する報奨金で私の評判全体を喜んで与えます。

ありがとう

4

1 に答える 1

0

さて、私はそれを修正しました。

これは私が使用することになったコードです。物事をとても簡単でよく説明してくれたMicrosoftに感謝します。

var siteUri = @"http://sharepoint-site-uri";
var methodUri = @"http://sharepoint-site-uri/namespace/service/method";
string responseXml = null;

var request = (HttpWebRequest)WebRequest.Create(siteUri);
var cc = new CredentialCache { { new Uri(siteUri), "NTLM", new NetworkCredential("user", "pwd", "domain") } };
request.Credentials = cc;

try
{
    // first site request
    var response = (HttpWebResponse)request.GetResponse();
    if (response.StatusCode == HttpStatusCode.OK)
    {
        request = (HttpWebRequest)WebRequest.Create(uri);
        request.CookieContainer = new CookieContainer();

        // copy the authentication cookies from the response
        foreach (Cookie c in response.Cookies)
        {
            request.CookieContainer.Add(c);
        }

        request.ContentType = "application/xml; charset=utf-8";

        // second request, now against the service url
        using (var reader = new StreamReader(request.GetResponse().GetResponseStream()))
        {
            // get the response text
            responseXml = reader.ReadToEnd();
        }
    }
}
catch (Exception e)
{       
   // handle error
}
于 2013-01-11T20:11:58.657 に答える