2009-06-07 3 views
1

C# 응용 프로그램 및 SQL Server 2005에서 데이터베이스에 데이터를 추가 할 수있는 사용자의 권한을 유지 관리하는 좋은 방법을 찾고 있습니다.SQL 권한을 사용하여 데이터를 추가하고 확인하는 방법?

이 내용을 명확하게 설명해야합니다. 이 예를 들어 봅시다 :

나는 두 명의 사용자가 BobJim입니다. 둘 다 SQL 권한에 추가되어 데이터베이스에 대한 쓰기 권한을 갖습니다. 이제 모든 액세스는 도메인 사용자 계정을 기반으로합니다. 다른 모든 사용자에게는 읽기 액세스 권한 만 있습니다.

  • 사용자
  • UserPermissions
  • BookPublishers

그래서 UserPermissions 사용자와 BookPublishers의 목록을 포함 :

는 지금과 같은 몇 가지 테이블을 가지고있다. 따라서 예 : BobMS PressJim에 도서를 추가 할 수있는 권한이있는 경우 O'Reilly에 도서를 추가 할 수있는 권한이 있습니다.

이제이 정보를 확인하고 추가 할 수있는 정보를 제한해야합니다.

그렇게 말 Jim는 명령 줄에서 내 응용 프로그램을 사용하는 그는 같은 것을 쓴다 가서 책을 테이블에 책을 추가해야

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

도구.

이제 에 의해 책을 추가 할 수있는 권한이 없으므로 Bob에서 동일한 명령이 시도됩니다.

지금 당장 나는 몇 가지 일을하는 법을 알아야합니다.

  • 는 사용자가 처음 사용자가
  • 는 또한 나는 위의 전에 사실임을 확인해야 특정 게시자 books을 추가 할 수있는 쓰기 권한이 있음을
  • 가 확인 SQL Server에 쓰기 권한이 있는지 확인 도구가 실제로 데이터를 추가하려고합니다. 즉, 도구를 계속하기 전에 확인 피드백이 먼저 필요합니다.

이제는 사용자가 악의적 인 데이터를 주입하는 것에 대해 100 % 걱정하지는 않습니다 만, 그것은 내부 도구이고 나는 uess 나는 사용자를 믿을 수있다 ... (가능하게)

어느 쪽이든 나는 어디에서 시작해야할지 모른다, 나의 SQL 기술은 매우 부족하다.

Akk, 마지막으로, 저장 프로 시저를 사용하여 데이터를 추가하고 싶지 않습니다.

+0

SQL Server 사용 권한 메타 데이터를 직접 쿼리해야합니다. 이 작업을 수행 할 수있는 일부 저장 프로 시저가 있지만 사소한 작업이 아닌 것을 기억하는 것 같습니다. –

답변

5

좋아,이 분해하자

는 사용자가 테이블에 쓸 수 있는지 확인합니다 (true의 경우하지 않을 경우이 0, 1을 반환합니다) :
SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', 'OBJECT', 'INSERT'), 0) 

은 사용자가 쓸 수 있는지 확인 해당 게시자 :

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

이제는 실제 C#이 아닌 SQL입니다. 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(); 

, 를 귀하의 의견을 정화. 응용 프로그램에서 매개 변수를 사용하고 은 내부 사용자도 신뢰하지 않습니다.. 나는 충분히 강조 할 수 없다.

편집 :

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

A로부터 : 고양이를 피부에 하나의 방법보다 더 있기 때문에, 나는 (적어도 카운트 문제에) SQL 솔루션에 LINQ를 포함하지하는 것이 어리석은 나를 느꼈다 UI의 편집 가능성을 관리하는 데 더 우호적이지 않은지 궁금하다. 사용자로서 데이터를 입력하고 해당 항목을 작성할 수있는 권한이없는 메시지가 누락되면 귀하의 웹 사이트에 계속 참여하도록 권장하지 않습니다.

사용자가 데이터베이스에 항목을 추가 할 수없는 경우 읽기 전용 페이지 (또는 DIV)를 표시 할 수 있습니다. 새 항목을 저장할 권한이있는 사용자는 편집 가능한 페이지/DIV를 얻습니다.

일부 범주의 정보는 저장할 수 있지만 다른 범주는 저장할 수없는 사용자의 경우 드롭 다운 목록을 사용하여 해당 범주의 항목을 제한 할 수 있습니까? 예를 들어 Bob의 게시자 드롭 다운 목록에는 MSPress가 표시되고 Jim의 목록에는 O'Reilly가 포함됩니다. 그렇게하면 데이터를 추가하기 전에 허용 된 사항을 해당 목록에서 명확하게 볼 수 있습니다. 권한은 사용자가 숨길 수있는 비밀은 아닙니다.

+0

이것은 실제로 API, CMD 및 GUI 도구 모두에 사용됩니다. 그래서 대부분의 경우 그것은 괜찮을 것입니다. CMD 도구는 필요에 따라 매개 변수를 전달하기 때문에 사용자가이를 확인해야합니다. 그들은이 권리를 얻고, 그렇지 않으면 도구가 오류를 일으킬 것으로 예상됩니다. –

관련 문제