web-dev-qa-db-ja.com

IIS 7.5でWindows認証が失敗する

会社のシンプルな内部アプリケーションを構築していますが、セキュリティのためにWindows認証が必要です。他のすべての認証モードは無効です。 Internet Explorerが資格情報の入力を3回要求した後、このエラーで失敗するという状況に陥っています。

許可されていません

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

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

以下にいくつかのシナリオを示します。

  • Webサーバー自体からhttp:// localhost:8111 /にアクセスすると正常に動作します

  • 別のコンピューターからhttp:// ServerIPaddress:8111 /にアクセスすると正常に動作します

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

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

23
Ben Brandt

この問題との2日間の戦いの後、同僚の助けを借りてソリューションを解決しました。彼が書いたものは次のとおりです。

Windows認証には2つのプロバイダー(ネゴシエートとNTLM)があります。 Webサイト認証をWindows認証に設定する場合、Windows認証が強調表示されている間に、右側のペインの[プロバイダー]リンクをクリックするか、IIS ManagerでNTLMを先頭に移動します。これが認証プロンプトを取得する理由です。

43
Ben Brandt

統合認証を使用する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

18
leorzz

NTMLをプロバイダーのリストの一番上に移動してもまだ機能しない場合は、Negotiateを完全に削除して、NTMLのみを残してください。

NTMLをトップに移動しても、Windows Server 2012およびIIS 8.5では解決しませんでした。次のstackoverflowの問題で解決策を見つけました: IIS 7.5 Windows認証がChromeで機能しない

5
Thomas T

サーバー上でループバックチェックをグローバルに無効にしないことを個人的にお勧めします(IE:Do[〜#〜] not [〜#〜]set DisableLoopbackCheckレジストリの1の値に)。これはセキュリティの脆弱性です。既知のホストに対してのみ無効にしてください。

これが正しい方向に向けられる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"

ソース

4
Chase Florell

この質問が聞かれてからしばらく経ちましたが、多くの人がこの問題に頻繁に遭遇することを知っています。これに対するより適切な修正については、 カーネルモード認証 で説明しています。これを数か月前に実装しましたが、正常に機能します。

ここで別の良い説明: 2008年以降およびKerberos:認証が拒否されました、アプリプールアカウントが登録されていません

単一のサイトに適用するには:

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
1
mservidio