会社のシンプルな内部アプリケーションを構築していますが、セキュリティのために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エラーが発生します)
私はこれまでオンラインで検索し、運のない解決策を見つけようとしてきました。私はそれを見つけていないか、私が読んでいるものを十分に理解していません。どんな助けも大歓迎です。
この問題との2日間の戦いの後、同僚の助けを借りてソリューションを解決しました。彼が書いたものは次のとおりです。
Windows認証には2つのプロバイダー(ネゴシエートとNTLM)があります。 Webサイト認証をWindows認証に設定する場合、Windows認証が強調表示されている間に、右側のペインの[プロバイダー]リンクをクリックするか、IIS ManagerでNTLMを先頭に移動します。これが認証プロンプトを取得する理由です。
統合認証を使用する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.
NTMLをプロバイダーのリストの一番上に移動してもまだ機能しない場合は、Negotiateを完全に削除して、NTMLのみを残してください。
NTMLをトップに移動しても、Windows Server 2012およびIIS 8.5では解決しませんでした。次のstackoverflowの問題で解決策を見つけました: IIS 7.5 Windows認証がChromeで機能しない
サーバー上でループバックチェックをグローバルに無効にしないことを個人的にお勧めします(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"
この質問が聞かれてからしばらく経ちましたが、多くの人がこの問題に頻繁に遭遇することを知っています。これに対するより適切な修正については、 カーネルモード認証 で説明しています。これを数か月前に実装しましたが、正常に機能します。
ここで別の良い説明: 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