2009-06-07 3 views
1

Я ищу хороший способ поддерживать разрешения на то, кто может добавлять данные в базу данных в приложении C# и SQL Server 2005.Разрешения SQL для добавления данных и как их проверить?

Мне нужно объяснить, хотя это ясно. Итак, давайте возьмем пример:

У меня есть два пользователя Bob и Jim, оба они добавлены в разрешения SQL, чтобы они имели доступ на запись в базу данных. Теперь весь доступ основан на учетных записях пользователей домена. Все остальные пользователи имеют доступ только для чтения.

Теперь у меня есть несколько таблиц, таких как:

  • пользователей
  • UserPermissions
  • Книги
  • BookPublishers

Так UserPermissions содержит список пользователей и BookPublishers. Так, например: Bob имеет разрешение на размещение книг на номера MS Press и у Jim есть разрешение на публикацию книг для O'Reilly.

Теперь мне нужно проверить эту информацию и ограничить то, что они могут добавить.

Так сказать Jim использует мое приложение из командной строки, и он пишет что-то вроде:

Addbook.exe "C# 3.0 in a Nutshell" "O'Reilly"

Инструмент должен идти вперед и добавить книгу в книжном столе.

Теперь скажите Bob пытается выполнить ту же команду, инструмент должен быть ошибкой, так как у него нет разрешения на добавление книг на O'Reilly.

Прямо сейчас мне нужно знать, как сделать пару вещей.

  • Убедитесь, что пользователь сначала разрешение на запись в SQL Server
  • Убедитесь, что пользователь имеет право на запись, чтобы добавить books конкретным издателем
  • Кроме того, мне нужно, чтобы убедиться, что это верно до инструмент на самом деле пытается добавить данные, т. е. мне нужно проверить обратную связь, прежде чем инструмент продолжит

Теперь я не на 100% обеспокоен тем, что пользователь вводит вредоносные данные, хотя было бы неплохо остановить это, но это внутренний инструмент, и я uess Я могу доверять пользователям ... (возможно)

В любом случае я не знаю, с чего начать, мои SQL-навыки очень не хватает.

Akk, последнее, что я не хочу добавлять данные, используя процедуры хранения.

+0

Вам необходимо напрямую запросить метаданные разрешений SQL Server. Есть несколько хранимых процедур, которые вы можете вызвать, которые будут делать это, но я, кажется, помню, что это не тривиальная задача. –

ответ

5

Хорошо, давайте разберем это вниз:

Убедитесь, что пользователь может записать в таблицу (это возвращает 1, если оно истинно, 0, если нет):

SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', 'OBJECT', 'INSERT'), 0) 

Убедитесь, что пользователь может написать что издатель:

SELECT count(*) FROM UserPermissions WHERE 
UserName = 'username' AND Publisher = 'publisher' 

Теперь это SQL для тех, а не для C#. Для того, чтобы получить значения в C#:

SqlConnection SqlConn = new SqlConnection("connection_string_goes_here"); 
SqlCommand SqlCmd = new SqlCommand(); 

SqlConn.Open(); 
SqlCmd.Connection = SqlConn; 
SqlCmd.CommandText = "SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', " + 
    "'OBJECT', 'INSERT'), 0)" 

if (SqlCmd.ExecuteScalar()) 
{ 
    SqlCmd.CommandText = 
     "SELECT count(*) FROM UserPermissions WHERE " + 
     "Username = " + System.Environment.UserDomainName + "\" + 
      System.Environment.UserName + " " + 
     AND Publisher = @Publisher"; 
    SqlCmd.Parameters.Add("@Publisher", SqlDbType.NVarChar); 
    SqlCmd.Parameters("@Publisher").Value = PublisherInput; 

    if(SqlCmd.ExecuteScalar()) 
    { 
     SqlCmd.Parameters.Clear(); 
     SqlCmd.CommandText = "INSERT INTO Books (Title, Publisher) VALUES " + 
          "(@Title, @Publisher)"; 
     SqlCmd.Parameters.Add("@Title", SqlDbType.NVarChar); 
     SqlCmd.Parameters.Add("@Publisher", SqlDbType.NVarChar); 
     SqlCmd.Parameters("@Title").Value = TitleInput; 
     SqlCmd.Parameters("@Publisher").Value = PublisherInput; 
     SqlCmd.ExecuteNonQuery(); 
    } 
} 

SqlCmd.Dispose(); 
SqlConn.Close(); 
SqlConn.Dispose(); 

В качестве последней ноты, очистить вход. Используйте параметры в своем приложении, а не доверяйте никому, даже внутренним. Я не могу это подчеркнуть.

Edit: Потому что есть более чем один способ кожи кошки, я чувствовал, что это глупо, чтобы не включать LINQ для решения SQL (по крайней мере, в вопросе подсчета):

int PermsAvailable = (from up in db.UserPermissions 
         where up.Username == 
          System.Environment.UserDomainName + "\" + 
          System.Environment.UserName 
         && up.Publisher == PublisherInput 
         select up).Count(); 
if(PermsAvailable) 
{ 
    var NewBook = New Book with {.Title = TitleInput, .Publisher = PublisherInput}; 
    db.Books.Add(NewBook); 
} 
+0

Удивительный, в то время как я не так плохо разбираюсь в коде, это было больше, если идея проверки разрешений и последующего продолжения - правильный путь. Похоже, это неплохо, и это в значительной степени покрывает то, что я ожидал. Благодарю. –

3

This article имеет объяснение различных способов защиты приложений с конкретными разрешениями.Стоит прочитать оставшуюся часть серии, а также предыдущую серию ASP.NET 2.0, чтобы понять используемую архитектуру.

+0

Хорошая статья о том, как добавить поставщика членства SQL Server ASP.NET на сайт, но он использует код для проверки членства в роли, прежде чем разрешение будет предоставлено для выполнения задачи. Ситуация в вопросе заключается в том, что сама система безопасности SQL Server используется для предоставления или запрета доступа к базе данных - и код C# должен определить, что такое эти разрешения. –

+0

Это очень полезно, поскольку мне также нужен некоторый элемент управления asp.net. Единственный улов в том, что для этого вопроса это было немного не по теме. –

1

От А удобство использования, интересно, было бы нелегко управлять редактируемостью в пользовательском интерфейсе. Как пользователь, если я ввожу данные и получаю сообщение с сообщением, что у меня нет разрешения на внесение этой записи, мне не будет предложено продолжать участвовать в вашем веб-сайте.

Если пользователь не может добавить записи в базу данных, вы можете отобразить страницу только для чтения (или DIV). Пользователи, имеющие разрешения на сохранение новых записей, получат доступную для редактирования страницу/DIV.

Для пользователя, которому разрешено сохранять некоторые категории информации, но не другие, будет ли он работать, чтобы ограничить записи в этой категории с помощью раскрывающегося списка? Например, раскрывающийся список издателя Bob's отображает MSPress, а в списке Джима включен O'Reilly. Таким образом, они могут ясно видеть из этих списков то, что им разрешено делать до того, как они попытаются добавить данные. Разрешения не являются секретом, скрытым от пользователя.

+0

Это фактически будет использоваться для инструментов API, CMD и GUI. Так что в большинстве случаев все будет хорошо. Инструмент CMD, хотя и предназначен для передачи любого параметра по мере необходимости, и пользователю необходимо его проверить. Ожидается, что они получат это право, и если инструмент не будет ошибочным. –