понедельник, мая 07, 2007

Имперсонация ASP.NET и SQL Trusted Connection

Возвращаясь к теме Безопасное подключение к SQL серверу. В этой заметке я писал, что одним из препядствий для использоватния SQL Trusted Connection может стать включенный режим ASP.NET имперсонации <identity impersonate=”true”>. Вам пришлось бы открыть доступ к БД для всех пользователей вашего сайта, потому что каждый пользователь будет подключаться к SQL серверу под своей учетной записью. (Если это именно то, что вам надо, можете дальше не читать :).
Оказывается есть способ преодолеть эту проблемму, и обеспечить подключение всех из под учетной записи рабочего процесса ASP.NET. У класса WindowsIdentity есть метод Impersonate(IntPtr), который позволяет проводить имперсонацию в ручную (как его использовать - см. MSDN). Если в этот метод передать IntPtr.Zero, то произойдет имперсонация к исходной учетной записи рабочего процесса ASP.NET. Этим и воспользуемся.


// заметьте, метод возвращает уже открытое соединение
public SqlConnection RevertAndOpenConnection(string connectionString)
{
SqlConnection connection = null;
WindowsImpersonationContext ctx = null;
try
{
// Самый главный трюк. Возвращаемся к identity процесса.
ctx = WindowsIdentity.Impersonate(IntPtr.Zero);
connection = new SqlConnection(connectionString);
// Открываем соединение
connection.Open();
}
finally
{
// Восстанавливаем identity потока
if(ctx != null) ctx.Undo();
}
return connection;
}

// пример использования RevertAndOpenConnection()
public void UsingExample()
{
using(SqlConnection connection = RevertAndOpenConnection("Integrated Security=true;server=."))
{
SqlCommand command = new SqlCommand("select suser_sname()", connection);
// в строке userName будет имя учетной записи рабочего процесса
string userName = command.ExecuteScalar().ToString();
System.Diagnostics.Debug.WriteLine(userName);
}
}

Проверял. Трюк работает на IIS 5.0 и IIS6.0 под Windows XP и под Windows2003.
Эту идею мне подкинул коллега Михаил Ознобкин, за что ему от всех нас большой респект.

1 комментарий:

Анонимный комментирует...
Этот комментарий был удален администратором блога.