25

会社用の単純な内部アプリケーションを構築していますが、セキュリティのためにWindows認証が必要です。他のすべての認証モードは無効になっています。Internet Explorerがクレデンシャルの入力を3回要求し、次のエラーで失敗する状況で立ち往生しています。

許可されていません

HTTPエラー401。要求されたリソースにはユーザー認証が必要です。

次に、これをテストするための最低限のWebサイトを作成しました。IISで新しいサイトを作成し、それを独自のポート(:8111、ランダムに選択)に配置し、そこに静的な "default.htm"ファイルを1つ配置し、匿名認証を無効にしてから、Windows認証を有効にしました。それ以外はすべてデフォルト設定のままにしました。このマシンには複数のサイトがあり、すべて同じIPを共有しているため、ポート番号が割り当てられました。

ここにいくつかのシナリオがあります:

  • Webサーバー自体からhttp:// localhost:8111/へのブラウジングは正常に機能します

  • 別のコンピューターからhttp:// ServerIPaddress:8111/へのブラウジングは正常に機能します

  • 別のコンピューターからhttp:// ServerName:8111 /にブラウジングすると失敗します(資格情報を3回要求した後、401エラーが発生します)

私はこれまでオンラインで検索し、運が悪かった解決策を見つけようとしてきました。私はそれを見つけられなかったか、私が読んでいるものを十分に理解していません。どんな助けでも大歓迎です。

4

5 に答える 5

46

この問題と2日間戦った後、同僚の助けを借りて解決策を見つけました. 彼が書いたものは次のとおりです。

Windows 認証には 2 つのプロバイダー (ネゴシエートと NTLM) があります。Web サイト認証を Windows 認証に設定する場合、Windows 認証が強調表示されているときに、右側のペインまたは IIS マネージャーの [プロバイダー] リンクをクリックし、NTLM を一番上に移動します。デフォルトでは Negotiate が一番上にあるため、認証プロンプトが表示されます。

于 2012-10-02T18:09:01.723 に答える
19

統合認証を使用する Web サイトを参照すると、エラー 401.1 が発生します。

解決

ループバック チェックを無効にする

* In Registry Editor, locate and then click the following registry key:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

* Right-click Lsa, point to New, and then click DWORD Value.
* Type DisableLoopbackCheck, and then press ENTER.
* Right-click DisableLoopbackCheck, and then click Modify.
* In the Value data box, type 1, and then click OK.

http://support.microsoft.com/kb/896861

于 2012-10-22T16:03:53.767 に答える
4

個人的には、サーバーで loopbackcheck をグローバルに無効にしないことをお勧めします (IE:レジストリで値を設定しないでください)。これはセキュリティ上の脆弱性です。既知のホストに対してのみ無効にしてください。DisableLoopbackCheck1

これは、正しい方向に向けるための Powershell 関数です。

function Add-LoopbackFix
{
    param(
        [parameter(Mandatory=$true,position=0)] [string] $siteHostName
    )

    $ErrorActionPreference = "Stop"

    Write-Host "Adding loopback fix for $siteHostName" -NoNewLine

    $str = Get-ItemProperty -Name "BackConnectionHostNames" -path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -erroraction silentlycontinue

    if ($str) { 
        if($($str.BackConnectionHostNames) -like "*$siteHostName*")
        {
            Write-Host "`tAlready in place" -f Cyan
        } else{
            $str.BackConnectionHostNames += "`n$siteHostName"
            Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0" -Name "BackConnectionHostNames" -Value $str.BackConnectionHostNames 
            Write-Host "`tDone" -f Green
        }
    } else {
        New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0" -Name "BackConnectionHostNames" -Value $siteHostName -PropertyType "MultiString" 
        Write-Host "`tDone" -f Green
    }

    Write-Host "`tnote: we are not disabling the loopback check all together, we are simply adding $siteHostName to an allowed list." -f DarkGray
}
> Add-LoopbackFix "ServerName"

ソース

于 2015-02-21T17:29:02.910 に答える
2

この質問が出されてからしばらく経ちましたが、多くの人がこの質問に出くわすことがよくあります。これに対するより適切な修正方法については、こちらで説明しています: Kernel-mode authentication。数か月前にこれを実装しましたが、問題なく動作します。

ここでの別の適切な説明: MORE 2008 AND KERBEROS: AUTHENTICATION DENIED, APP POOL ACCOUNT BEING IGNORED

1 つのサイトに適用するには:

cd %windir%\system32\inetsrv
set SiteName=TheSiteName
appcmd.exe set config "%SiteName%" -section:system.webServer/security/authentication/windowsAuthentication /useKernelMode:"True" /useAppPoolCredentials:"True" /commit:apphost

または、すべてのサイトに適用するには:

%windir%\system32\inetsrv\appcmd.exe set config -section:windowsAuthentication /useAppPoolCredentials:"True" /commit:apphost
于 2014-01-30T18:18:28.183 に答える