4

イントラネット用に構築した複数の Web アプリケーションがあります。ユーザーがログインについて心配しないようにしたかったので、これらのアプリは、サイトにアクセスしたときに現在ログオンしているユーザーをプルします。これを実現するために、次のコードを使用しました。

Dim userName As String = User.Identity.Name
CurrentUser = userName.Substring(userName.IndexOf("\") + 1)

これは魅力のように機能しますが、ここでは問題ありません。次のステップは、ログインしているユーザーの Active Directory にクエリを実行して、さまざまな情報を取得することです。私が現在どのようにコーディングしているか、それは開発側の魅力のように機能します (私は IIS を実行していないため、典型的です)。

問題は、IIS サーバー (IIS 7.5 を実行している Windows Server 2008 R2) に公開すると、Active Directory をクエリするコード内の特定の行を指すエラー メッセージが表示されます。興味深いのは、これらのアプリが先週うまく機能していたことです。私のサーバー管理者が Windows Update の最新のバッチを実行した後、それらは壊れました (注意してください、私は .Net Framework 4.0 を使用してそれらを実行しています)

Windows 認証が有効になるように各アプリをセットアップする前に、他の認証タイプを無効にしました。プロバイダーの場合、ネゴシエートが 1 位、NTLM が 2 位です。詳細設定では、拡張保護 = オフ、およびカーネル モード認証を有効にするがオンになっています。

私のweb.configには次のセットがあります:

<customErrors mode="Off"/>
<authentication mode="Windows" />
<authorization>
  <deny users="?"/>
</authorization>

これらは私が持っていた設定であり、すべてが魅力的に機能しました. NTLM が 1 位で、Negotiate が 2 位になるように、プロバイダーを交換する必要があります。このため、ユーザーの資格情報が正しく渡されず、AD クエリが失敗します。これは、クエリに使用しているコーディングです。

Dim adSearchRoot As New DirectoryEntry("LDAP://DC=[DOMAIN],DC=com")
Dim adSearch As New DirectorySearcher(adSearchRoot)

adSearch.Filter = "(&(ObjectClass=User)(sAMAccountName=" & CurrentUser & "))"
Dim searchResult As SearchResult = adSearch.FindOne()

更新以来、前にネゴシエートを使用してサイトをロードすると、DirectoryEntry にユーザー名/パスワードが設定されていないため、その最終行で失敗します。ユーザー名/パスワードを設定しても、以前のように 100% 機能しません。

だから私の質問は、ユーザーがサイトにアクセスし、ユーザー名を知り、DirectoryEntry でユーザー名/パスワードを使用せずに Active Directory を照会できるようにするには、どうすればよいですか??

IISの設定ですか?または、再コーディングする必要がありますか? おそらくweb.config設定?サーバーの更新を元に戻し、中断が発生した原因を特定する必要がありますか?

アドバイスありがとうございます。ご不明な点がございましたら、お気軽にお問い合わせください。

アップデート

Matt が提案したように、次のクリップを web.config ファイルに追加してみました。

<security>
  <authorization>
    <add accessType="Deny" users="?" />
  </authorization>
</security>

これはうまくいきませんでした。いくつか読んだ後、このセクションをさらに変更しました。

<location path="Default Web Site/NameOfApp">
  <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication enabled="false"/>
        <windowsAuthentication enabled="true">
          <providers>
            <add value="Negotiate" />
            <add value="NTLM" />
          </providers>
        </windowsAuthentication>
      </authentication>
      <authorization>
        <add accessType="Deny" users="?" />
      </authorization>
    </security>
  </system.webServer>
  </location>

これを行う際に、web.config セクションの上位にある文字列も削除しました。これも機能しませんでした(fyi、これは素晴らしいリファレンスでしたhttp://www.iis.net/ConfigReference/system.webServer/security/authentication

次に、この記事に出くわしました: http://social.technet.microsoft.com/Forums/en/winserverDS/thread/7deba16b-295a-4887-98f9-9f291ed49871同様の状況のようです。この記事は最終的に「Double Hops」を参照しました。これを調べていくつかのことを試した後、これでも問題は解決しませんでした。

次のステップ

別の Server 2008 R2 システムで新しい IIS 7.5 の実装を試し、基本的に最初からやり直して、問題が再現するかどうかを確認します。

新しい提案は非常に役立ちます。

4

2 に答える 2

1

Windows 2008 Server で問題なくコードを実行できました。新しい .NET 4.0 アプリケーション プールを作成し、それを Web アプリケーションに割り当てました。匿名アクセスを拒否し、Windows 認証を使用するように web.config を変更しました。コードは例外なく実行されました。

あなたの web.config クリップを見ると、これが欠けているのではないかと思います:

  <system.webServer>
    <security>
      <authorization>
        <add accessType="Deny" users="?" />
      </authorization>
    </security>
  </system.webServer>

system.webServerセクション内にこの認証セクションがあることが重要です。IIS 7 は、system.webServer セクションを使用して、IIS 6 のメタベースの一部であったいくつかの設定を保存します。

于 2011-12-29T22:08:36.073 に答える
0

私はこれと同じ問題を抱えていました。これが私がそれを解決した方法です:

パスだけでなく、ユーザー名とパスワードも許可する DirectoryEntry コンストラクターにオーバーロード 4 of 5 を使用します。したがって、AD 接続は次のようになります。

DirectoryEntry adSearchRoot = new DirectoryEntry("LDAP://DC=[DOMAIN],DC=com", "DOMAIN\Username", "Password");
DirectorySearcher adSearch = new DirectorySearcher(entry);

ここで、「DOMAIN\Username」の代わりにサービス アカウントを使用し、パスワードにはもちろんサービス アカウントのパスワードを使用します。

サービス アカウントが「ドメイン ユーザー」グループのメンバーである限り、問題なく AD にクエリを実行できるはずです。

于 2012-04-10T19:37:24.303 に答える