Веб-приложение ASP.Net пытается использовать олицетворение и делегирование для подключения к SQL Server - PullRequest
15 голосов
/ 20 января 2010

Я пытаюсь использовать олицетворение и делегирование в веб-приложении ASP.Net в интрасети для передачи учетных данных аутентифицированных пользователей на SQL Server.

Веб-сервер и SQL-сервер - это две отдельные машины, но в одном домене, поэтому требуется делегирование.

Я сделал следующее:

  • установите <authentication mode="Windows"/> и <identity impersonate="true"/> в файле web.config моего веб-приложения.
  • разрешено ограниченное делегирование с веб-сервера службе MSSQLSvc на SQL Server в Active Directory.
  • разрешена только проверка подлинности Windows на веб-сайте через IIS.

Очевидно, что все это должно работать, но это не так (SQL Server запрещает доступ анонимному пользователю - «Ошибка входа в систему для пользователя« NT AUTHORITY \ ANONYMOUS LOGON »»).

В IIS7 пул приложений настроен на использование режима интегрированного пиплайна и работает с идентификатором NetworkService. На веб-сайте включена только аутентификация Windows, расширенная защита отключена, аутентификация в режиме ядра включена, а NTLM является поставщиком.

Кажется, что все прочитанные мной веб-страницы указывают на то, что мои настройки должны работать. Чего мне не хватает?

Ответы [ 2 ]

16 голосов
/ 20 января 2010

Я обнаружил ответ:

Поставщик проверки подлинности Windows в IIS7 должен быть установлен на Согласование: Kerberos , а не NTLM. Это означает, что параметр аутентификации в режиме ядра должен быть отключен. Это, кажется, хорошо. Я думаю, что я прав, говоря, что аутентификация в режиме ядра требуется при использовании пользовательского идентификатора, т.е. одного конкретного идентификатора. Делегирование может использовать произвольное количество идентификаторов. Так что все хорошо.

Я также написал в блоге об этом, что более подробно.

0 голосов
/ 27 августа 2013

Нет - неверно говорить, что вам нужно Kerberos, SPN, чтобы доверять серверу для делегирования, и что это ЕДИНСТВЕННЫЙ способ сделать это. Да, это один из способов сделать это (и вам нужно все это, чтобы это произошло через Kerberos), но это не ЕДИНСТВЕННЫЙ, или даже технически самый безопасный или самый простой способ. Вы действительно хотите сделать дополнительные настройки и создать логин для каждого веб-пользователя для вашей базы данных в SQL? Что если какая-либо из этих учетных записей будет взломана? Больше аккаунтов, больше уязвимостей.

Нет, вместо этого создайте учетную запись службы домена и разрешите этому доступ к SQL. Если ваши сотрудники службы безопасности заблокировали вещи, предоставьте этому пользователю следующие права: вход в систему как служба, вход в систему как пакетное задание и разрешение локального входа в систему. Или, если это просто для того, чтобы развить и проверить теорию, или вам все равно, или вы не можете найти настройки, или по-прежнему получаете ошибки позже, и это может не получить большого числа подписчиков, но вы должны предоставить это локальному администратору (иногда вы должен делать то, что должен делать - некоторые профессионалы в области безопасности фиксируют вещи более жесткие, чем я хотел бы написать - всегда могут позже устранить неполадки безопасности, чтобы заблокировать их). Затем установите эту учетную запись в качестве настраиваемой учетной записи в пуле приложений и введите для этой учетной записи имя в SQL. Дайте ему dbo только на ЭТО ОДНУ базу данных.

На веб-сайте в IIS установите тип аутентификации Windows. Я видел, как они говорят «Basic» в других блогах, поэтому Kerberos будет работать, но NTLM использует проверку подлинности Windows. В IIS 7 вы также можете включить олицетворение ASP .NET. Лично я пробовал это только на IIS 6, но основной принцип тот же.

В файле web.config добавьте его в <configuration>, который является «равноправным» для <system.web>:

<connectionStrings>
  <add 
     name="NorthwindConnectionString" 
     connectionString="Data Source=serverName;Initial 
     Catalog=Northwind;Integrated Security=SSPI;User 
     ID=userName;Password=password"
     providerName="System.Data.SqlClient"
  />
</connectionStrings>

А в <system.web>:

<authentication mode="Windows"/> 
<identity impersonate="true"
      userName="domain\user" 
      password="password" />

Затем прочитайте строку в ваше приложение следующим образом:

using System.Configuration;

string connString = String.Empty;
if (ConfigurationManager.ConnectionStrings.ConnectionStrings.Count > 0)
{
    connString = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString; 
    if (connString != null) // do DB connection stuff here
        Console.WriteLine("Northwind connection string = \"{0}\"",
        connString.ConnectionString);
    else
        Console.WriteLine("No Northwind connection string");
}

См. http://msdn.microsoft.com/en-us/library/ms178411.aspx.

Если он не подключится к учетной записи службы после заполнения этой учетной записи в web.config для тега олицетворения и подключения SQL, вы можете затем использовать методы олицетворения с помощью WindowsImpersonationContext (http://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.aspx). В частности, вы хотите wic.Impersonate () и wic.Undo () после получения их токена. Вы можете прочитать в домене учетной записи службы, имя и пароль из web.config в форме AppKeys.

Короче говоря, есть способы обойти проблемы. Вы даже можете зашифровать пароль в файле web.config - как в ConnectionString, так и, если вы хотите сохранить его в AppKey, а не непосредственно в теге «олицетворять», если вы не хотите, чтобы пароли в виде простого текста были там (что Я бы рекомендовал против), и поэтому вы можете использовать его для создания токена Logon, если вам нужно использовать методы олицетворения (как я).

...