ASP.NET MVC3 IIS6 позволяет пользователям домена получать доступ к сайту, но другой пользователь подключается к базе данных - PullRequest
1 голос
/ 06 января 2011

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

1 Ответ

1 голос
/ 06 января 2011

Если вы хотите получить доступ к SQL-серверу через Windows Auth, тогда изменение удостоверения пула приложений - это путь.

В web.config вам нужно установить impersonate="false" или ASP.NET будет пытаться использовать учетные данные клиента для подключения к базе данных вместо пула приложений (т. Е. Похоже, что олицетворение делает именно то, что вы просили).

В IIS вы должнывключите встроенную аутентификацию Windows, и вы можете отключить анонимный доступ, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...