ASP.NET MVC3 IIS6 Разрешить пользователям домена доступ к сайту, но другой пользователь, подключающийся к базе данных

StackOverflow https://stackoverflow.com/questions/4609477

Вопрос

MVC 3 (вероятно, одинаково для 1 и 2), сервер 2003, IIS 6, .NET 4, SQL Server 2005

У меня есть простое приложение администратора, которое когда-либо входит только на 2 или 3 человека, поэтому я не хочу беспокоиться с формы аутентификации, отдельное имя пользователя / PW и все это. Я хочу просто иметь пользователь войти с их существующим рекламным пользователем / 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(Users = @"domain\user1, domain\user2, domain\user3")]

То, что им следует предлагать ввести свой рекламный пользователь / PW (или нет с IE, в зависимости от зоны и параметров автоматического входа в систему), затем будьте аутентифицированы, но используйте выделенный пользователь в IIS для подключения к БД. Как мне это сделать?

Я всегда предполагал, что олицетворение было способ пойти, так что это в моей web.config:

  <system.web>
    <identity impersonate="true"/>
    <authentication mode="Windows" />

Я пытался добавить это, но не помогает:

  <anonymousIdentification enabled="false"/>
  <authorization>
      <allow users="*"/>
      <deny users="?"/>
  </authorization>

Я могу получить все, чтобы работать для меня, если я использую базовую аутентификацию, но это только потому, что моя учетная запись также имеет доступ к БД. Если другой пользователь, который в этом пользователю = список, но не имеет доступа к БД пытается, они получают:

Cannot open database "Dbname" requested by the login. The login

не удалось. Не удалось в систему для пользователя «Домен user3».

Очевидно, что олицетворение не делает ее здесь.

Итак, это должно быть довольно типичным примером того, как аутентифицироваться за брандмауэром в средней сети Windows. Какой лучший подход? Я считал пользовательский авторизеаттрибут, используя код, похожий на Аутентификация LDAP в ASP.NET MVC Это похоже на то, как все работало в классическом приложении ASP, но по какой-то причине я подумал, что смогу просто получить все, что работает с настройками и конфигурированием в одиночку.

Редактировать1:

Прочитав некоторые из барри-охраны Barry Dorrans 'Security ASP.NET, кажется, что я могу изменить пользователь пула приложений и иметь пользователь, который попадает в SQL Server DB. Это правильно? Или это пользователи Anon в настройках веб-сайта, которые попадают в БД?

Пробовал изменить пользователь пула приложения, но учетная запись не является частью группы iis_wpg. Это требуется, верно?

Редактировать2:С помощью Basic Checked Auth Anon проверил с указанным пользователем, я получаю следующее:

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 

С помощью Basic Auth не проверяют, Anon проверил с указанным пользователем, я получаю пустую страницу. Проверка с Dayments 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
Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top