web-dev-qa-db-ja.com

カーネルモード認証:リモートマシンからサイトにアクセスするときに401エラー

統合Windows認証とKerberos委任を使用するいくつかのクラシックASPサイトがあります。

これらはライブサーバー(最近Server 2008/IIS7サーバーに移行)では正常に機能しますが、開発PCまたは開発サーバーでは完全には機能しません。両方のマシンのIISは、古いマシンからエクスポートされたIIS Web展開ツールパッケージを介して構成されました。展開は完全に機能しませんでした。私は、サイトを機能させるために少しいじくり回さなければなりませんでした。

どちらかのマシンでローカルにアプリにアクセスする場合、それらは正常に機能します。別のマシンからアクセスすると、ユーザーはユーザー名/パスワードダイアログによってプロンプトが表示され、入力内容に関係なく、最終的には401(Unauthorized)エラーが発生します。

これらのマシンの構成を同様のライブサーバー(すべて正常に動作する)と比較してみましたが、一般的には同等のようです(IIS7.5(Windows 7/Server 2008 R2)にまだライブサーバーがない場合)。

これらのアプリケーションは、IDとして特別なドメインユーザーを使用する共通のアプリケーションプールで実行されます。このユーザーは、ライブマシンと開発マシンで同様の権限を持っています。 IIS6プラットフォームでは、Kerberos委任を有効にするために、このユーザー用にいくつかのSPNを設定する必要がありましたが、それらはまだ配置されています(カーネルモード認証のため、IIS7 +ではもはや必要ないと思いますが)。

さらに、このアカウントは、私が扱っている各マシンと同様に、ActiveDirectoryでKerberos委任に対して有効になっています。

展開によってIIS構成が変更された、または変更に失敗した可能性があるため、この問題が発生する可能性があると考えています。おそらく、完全な再構築(別のWeb展開の試行を除く)で解決できます。問題がありますが、現在の問題を修正したい(したがって理解したい)。

これまでのアイデアはありますか?

この問題を修正するためにもう一度試みたところ、ある程度の進歩はありましたが、完全な修正はまだありません...まだです。

(NetBIOS名ではなく)IPアドレスを介してサイトにアクセスすると、資格情報を受け入れてアプリケーションが機能することを除いて、同じダイアログが表示されることを発見しました。これは完全な修正ではありませんが、便利な手順です。

さらに興味深いことに、カーネルモード認証を無効にすると(IISマネージャー> Webサイト>認証>詳細設定)、アプリケーションが完全に機能することを発見しました。私の霧の理解は、これがIIS7以前の方法で効果的に機能しているということです。合理的な短期的な解決策ですが、この問題に関するIIS)からの次の明示的なアドバイスを検討してください。

デフォルトでは、IISはカーネルモード認証を有効にします。これにより、認証パフォーマンスが向上し、カスタムIDを使用するように構成されたアプリケーションプールでの認証の問題を防ぐことができます。ベストプラクティスとして、Kerberosの場合はこの設定を無効にしないでください。認証は環境で使用され、アプリケーションプールはカスタムIDを使用するように構成されています。

明らかに、これは私のアプリケーションが機能するはずの方法ではありません。それで、問題は何ですか?

3
CJM

私はこの問題に数年苦労してきました。定期的に、なんとか機能させることができますが、1年後にサーバーが移動し、新しいサーバーで機能させるためにもう一度戦わなければなりません。

そのような時が再び来ました...これらのKerberosの問題をデバッグするのに苦労した後、私は基本に戻りました:他の人々は私が試みたことを日常的に行ったに違いありません-彼らは何を使用しましたか?

私のテクニックを使っている人もいますが、明らかに問題はありませんでした。しかし、ほとんどの問題を解決する方法はたくさんあるので、Web上の2つまたは3つの例で見つかった手法を組み合わせて、以前の手法よりも信頼性が高く、複雑ではないように思われる別のアプローチでゲームを作成しました。 '悪名高いケルベロス'ダブルホップ 'を含まない:

Sub Authuser()

'Swap out values enclosed in []

If Session("UID") = "" or 1 then
    Dim rsUser, aUserID, aGroups, i
    Dim connAD, sBase, sFilter, sAttributes, sScope, sFullCommand, rsADUserInfo, oADSysInfo

    aUserID = Split(Request.servervariables("AUTH_USER"),"\")

    Set connAD = Server.CreateObject("ADODB.Connection")
    connAD.Provider = "ADsDSOObject"
    connAD.Properties("User ID") = "[MyDomain]\[MyDomainUser]" ' ### remember to make sure this user has rights to access AD
    connAD.Properties("Password") = "[password]"
    connAD.Properties("Encrypt Password") = true
    connAD.Open

    sBase = "<LDAP://DC=[MyDomain], DC=[MyDomainExt]>"
    sFilter = "(sAMAccountName=" & aUserID(1) & ")"
    sAttributes = "cn, mail, company, givenName, sn, ADsPath, name, sAMAccountName, telephoneNumber, memberof"
    sScope = "subtree"  
    sFullCommand = sBase & ";" & sFilter & ";" & sAttributes & ";" & sScope

    set rsUser = Server.CreateObject("ADODB.Recordset")
    set rsUser = connAD.Execute(sFullCommand)

    If not rsUser.EOF then
        Session("UID") = aUserID(1)
        Session("Name") = rsUser("cn")
        Session("Email") = rsUser("mail")
        If IsArray(rsUser.Fields(9)) Then
            aGroups = rsUser.Fields(9)
            For i = LBound(aGroups) To UBound(aGroups)
                If InStr(1, aGroups(i), "[MyUsersGroup]", 1) Then
                    Session("Auth") = 1
                End If
                If InStr(1, aGroups(i), "[MyAdminGroup]", 1) Then
                    Session("Admin") = 1
                End If
            Next
        Else
            Response.Write "No groups<BR>"
            Session("Auth") = 1
            Session("Admin") = 1
       End If
    Else 
        Response.Write "User not recognised in AD<br>"
    End if

    connAD.Close
    set rsUser = Nothing
    Set connAD = Nothing
End If

End Sub
0
CJM

別のブラウザで試してください。たとえば、Chrome現在IEを使用している場合)。これは、イントラネットまたは信頼できるゾーンにあるドメイン名からのものである可能性があります。 。ドメイン外から来ているかどうかによっては、リモートで機能しない可能性のある資格情報を保存しようとする可能性があります。

0