MVC 3 (вероятно, то же самое для 1 и 2), Server 2003, IIS 6, .NET 4, SQL Server 2005
У меня есть простое приложение администратора, в которое могут войти только 2 или 3 человека, поэтому я не хочу беспокоиться о проверке подлинности с помощью форм, отдельного имени пользователя / pw и всего такого. Я хочу, чтобы пользователь просто вошел с существующим пользователем AD / pw. Но я хочу подключиться к 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 / pw (или не с IE, в зависимости от зоны и параметров автоматического входа), затем пройти аутентификацию, но использовать выделенного пользователя в IIS для подключения к БД. Как мне это сделать?
Я всегда предполагал, что путь к подражанию - это путь, так что это в моем файле web.config:
<system.web>
<identity impersonate="true"/>
<authentication mode="Windows" />
Я пытался добавить это, но без помощи:
<anonymousIdentification enabled="false"/>
<authorization>
<allow users="*"/>
<deny users="?"/>
</authorization>
Я могу заставить все работать на меня, если я использую обычную аутентификацию, но это только потому, что моя учетная запись также имеет доступ к БД. Если другой пользователь, который находится в этом списке Users =, но не имеет доступа к БД, попытается, он получит:
Cannot open database "Dbname" requested by the login. The login
не удалось.
Ошибка входа для пользователя 'домен \ пользователь3'.
Очевидно, что подражание здесь не работает.
Итак, это должен быть довольно типичный пример аутентификации за брандмауэром в обычной сети Windows. Какой лучший подход? Я рассмотрел пользовательский атрибут AuthorizeAttribute, использующий код, подобный Аутентификация LDAP в ASP.Net MVC Это кажется ближе к тому, как все работает в классическом приложении asp, но по какой-то причине я подумал, что могу просто заставить все работать с только настройки и настройки.
EDIT1:
После прочтения вчерашнего вечера, посвященного началу работы ASP.NET Security Барри Дорранса, выяснилось, что я могу изменить пользователя пула приложений, и это будет пользователь, который обращается к БД SQL Server. Это правильно? Или пользователи Anon в настройках веб-сайта попадают в БД?
Попытка изменить пользователя пула приложений, но учетная запись не является частью группы IIS_WPG. Это требуется, верно?
EDIT2:
При проверке базовой аутентификации, после проверки с указанным пользователем, я получаю следующее:
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
При отключенной базовой аутентификации, при проверке указанного пользователя, я получаю пустую страницу. Проверка с выходом скрипача:
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