ASP.NET MVC3 IIS6 では、ドメイン ユーザーはサイトにアクセスできますが、別のユーザーはデータベースに接続できます
-
25-09-2019 - |
質問
MVC 3 (おそらく 1 と 2 で同じ)、Server 2003、IIS 6、.NET 4、SQL Server 2005
私は 2 人か 3 人だけがログインする単純な管理アプリを持っているので、フォーム認証や個別のユーザー名/パスワードなどを気にしたくありません。ユーザーに既存の AD ユーザー/パスワードを使用してログインさせたいと考えています。ただし、選択した DB に対する適切な権限をすでに持っている専用アカウントを介して SQL Server に接続したいと考えています。
次のシナリオでクラシック ASP でこれを実行しました
IIS: Enable anonymous Access: checked. Username/pw dedicated account for the SQL Server DB
Integrated Windows authentication: unchecked
Digest authentication: unchecked
Basic authentication: unchecked
.NET Passport authentication: unchecked
クラシック ASP アプリは、投稿された HTML フォームを受け入れ、LDAP 経由で認証します。
' Establish connection
Set objConnection = Server.CreateObject("ADODB.Connection")
' Connection properties
objConnection.Provider = "ADsDSOOBJECT"
objConnection.Properties("User ID") = strUsername
objConnection.Properties("Password") = strPassword
objConnection.Properties("Encrypt Password") = True
' Open connection
objConnection.open "DS Query", strUsername, strPassword ' user supplied user/pw
' Query Active Directory
strQuery = "SELECT cn FROM 'LDAP://" & strDomain & "' WHERE objectClass='*' "
Set objCommand = server.CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = strQuery
' Get recordset
Set objRS = objCommand.Execute
' If no record of user found
If objRS.BOF Or objRS.EOF Then
' User does not exist
AuthenticateUser = False
Else
' User is authentic
AuthenticateUser = True
End If
これと同じ動作を .NET でも実現したいのですが、HTML フォームは必要ありません。ユーザーが [Authorize] 属性を持つコントローラーにアクセスすると、次のようなことが起こる可能性があります。
[Authorize(Users = @"domain\user1, domain\user2, domain\user3")]
AD ユーザー/パスワードを入力するように求められ (ゾーンと自動ログイン オプションに応じて、IE では入力しない)、認証を受ける必要がありますが、DB への接続には IIS の専用ユーザーを使用する必要があります。これを実現するにはどうすればよいですか?
私は偽装が最善の方法であると常に考えてきたので、これを私の web.config に含めます。
<system.web>
<identity impersonate="true"/>
<authentication mode="Windows" />
これを追加しようとしましたが、役に立ちませんでした:
<anonymousIdentification enabled="false"/>
<authorization>
<allow users="*"/>
<deny users="?"/>
</authorization>
基本認証を使用すればすべてを機能させることができますが、それは私のアカウントが DB にもアクセスできるためです。Users = リストに含まれているが DB へのアクセス権を持たない別のユーザーが試行すると、次のメッセージが表示されます。
Cannot open database "Dbname" requested by the login. The login
失敗した。ユーザー「domain\user3」のログインに失敗しました。
ここでは明らかになりすましは役に立ちません。
したがって、これは、平均的な Windows ネットワークでファイアウォールの内側で認証する方法のかなり典型的な例である必要があります。最善のアプローチは何ですか?次のようなコードを使用してカスタム AuthorizeAttribute を検討しました。 ASP.Net MVC での LDAP 認証 これは、従来の ASP アプリでの動作に近いように思えますが、何らかの理由で、設定と構成だけですべてを動作させることができると考えていました。
編集1:
昨夜 Barry Dorrans の『Beginning ASP.NET Security』を読んだところ、アプリ プールのユーザーを変更して、そのユーザーを SQL Server DB にアクセスさせることができるようです。そうですか?それとも、DB にヒットするのは、Web サイト設定の Anon ユーザーですか?
アプリ プール ユーザーを変更しようとしましたが、アカウントは IIS_WPG グループの一部ではありません。それは必須ですよね?
編集2:基本認証をチェックし、指定したユーザーで非チェックを行うと、次の結果が得られます。
User.Identity.Name: DOMAIN\jcurran
User.Identity.IsAuthenticated: True
User.Identity.AuthenticationType: Basic
WindowsIdentity.GetCurrent().AuthenticationType: Kerberos
WindowsIdentity.GetCurrent().Name: DOMAIN\jcurran
WindowsIdentity.GetCurrent().IsAuthenticated: True
WindowsIdentity.GetCurrent().IsAnonymous: False
WindowsIdentity.GetCurrent().IsGuest: False
WindowsIdentity.GetCurrent().IsSystem: False
WindowsIdentity.GetCurrent().ImpersonationLevel.ToString(): Impersonation
Thread.CurrentPrincipal.Identity.Name: DOMAIN\jcurran
基本認証のチェックを外し、指定したユーザーで非チェックを行うと、空白のページが表示されます。fiddler で検査すると次の結果が得られます。
HTTP/1.1 401 Unauthorized
Date: Thu, 06 Jan 2011 18:02:42 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Cache-Control: private
Content-Length: 0
解決
Windows 認証を使用して SQL サーバーにアクセスすると仮定すると、 アプリプールIDの変更 が進むべき道です。
web.config で次のように設定する必要があります impersonate="false"
または、ASP.NET は、アプリ プールの資格情報ではなく、クライアントの資格情報を使用してデータベースに接続しようとします (つまり、偽装は、あなたが要求したことを正確に実行しているようです)。
IIS では、統合 Windows 認証を有効にする必要があり、必要に応じて匿名アクセスを無効にすることができます。