2

を使用してサービスを接続するOfficeプラグインがありますHttpWebRequest

ドメイン内を通過CredentialCache.DefaultNetworkCredentialsするので、すべて問題ありません。ドメイン外では、ユーザーはユーザー名、ドメイン、パスワードを提供する必要があります。これはATMでは機能しません。

それからのコードの一部:

CookieContainer cookies = new CookieContainer();

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = WebRequestMethods.Http.Post;
request.AllowAutoRedirect = true;
request.CookieContainer = cookies; // provide session cookie to handle redirects of login controller of the webservice

if (isWindowAuthentication) // isWindowAuthentication is set earlier by config
{
  if (Common.UserName.Length > 0)
  {
    string[] domainuser;
    string username;
    string domain;

    if (Common.UserName.Contains("@"))
    {
      domainuser = Common.UserName.Split('@');
      username = domainuser[0];
      domain = domainuser[1];
    }
    else
    {
      domainuser = Common.UserName.Split('\\');
      username = domainuser[1];
      domain = domainuser[0];
    }
    NetworkCredential nc = new NetworkCredential(username, Common.Password, domain);
    CredentialCache cache = new CredentialCache();
    cache.Add(request.RequestUri, "NTLM", nc);
    request.Credentials = cache;
  }
  else
  {
    request.Credentials = CredentialCache.DefaultNetworkCredentials;
  }
}

後でリクエストを行いrequest.GetResponse();ます。私が使用する場合CredentialCache.DefaultNetworkCredentials、すべてが正常に動作します。自分のnew NetworkCredential()パーツに切り替えた瞬間、認証は失敗します。

Apacheのログを確認しました(SSPImodを使用したApache2.2です)。それが成功すると、最初の要求はログインコントローラにリダイレクトされ、次にログインコントローラは資格情報を要求します。合格して動作します(ターゲットサイトにリダイレクトします)。

ログ1(動作):

192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "POST /ror/ioi/start?document%5Bguid%5D=%7Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%7D HTTP/1.1" 302 202
192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 401 401
192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 401 401
192.168.14.9 - rausch [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 302 156

ここでの独自のクレデンシャルの結果ログ2(機能しません):

192.168.14.9 - - [25/Oct/2012:12:05:23 +0200] "POST /ror/ioi/start?document%5Bguid%5D=%7B6ac54e8a-19f1-4ccd-9684-8d864dd9ccf7%7D HTTP/1.1" 302 202
192.168.14.9 - - [25/Oct/2012:12:05:23 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257B6ac54e8a-19f1-4ccd-9684-8d864dd9ccf7%257D HTTP/1.1" 401 401

私が理解していないのは、私が検査するときです。たとえばCredentialCache.DefaultNetworkCredentials.UserName、それは空です。

認証が期待どおりに機能するように、自分の資格情報を正しく設定する方法と方法を知っている人はいますか?

4

1 に答える 1

0

最後に、多くのテストと調査、およびスタックオーバーフローに関する多くのリソースの後で、何が起こっているのかを知りました。

httpwebrequest問題は、Webサイトの一部が資格情報を要求し、一部が要求しないときに認証を処理しないことであるように思われます。

バックグラウンド:

当サイトには独自のセッション管理があり、有効なセッションが利用できない場合はログインコントローラにリダイレクトされます。このログインコントローラのみがNTLM認証に設定されています。

これは、NTLM認証がまったくないWebサイトがあり(IEでは401、302要求ループがない!)、一度だけ検証するために作成しました(IEが認証されていない状態でデータの投稿を停止する問題を防ぐために、異なるURLで認証を処理しますサイト=> http://support.microsoft.com/?id=251404を参照)。

解決:

私は通常、ターゲットページでリクエストを送信し、ウェブサーバーはターゲットにリダイレクト、認証、リダイレクトします。自分の資格情報が設定されている場合、httpwebrequestは何らかの理由でこれを処理しないため(上記の質問のコードを参照)、ログインコントローラーに対して一度認証し、セッションをCookieコンテナーに保存するコードに変更しました。

以下のすべてのリクエストについて、私はもう何も自明ではありません。Cookieコンテナを追加すると、サーバーは有効なセッションを取得します。だから私はもう認証する必要はありません。副作用は、この方法でパフォーマンスが向上することです。

もう1つの注意点は、httpwebrequestを使用するだけでなく、Webフォームコントロールも使用することです。そのため、ここで独自のCookieセッションを追加するための解決策を見つけました。WebBrowserのCookieContainerからのCookieを使用します(Aaronにも多くのトラブルを救ってくれました)。

于 2012-10-29T19:23:38.413 に答える