2009-06-07 33 views
1

我正在尋找一種很好的方法來維護誰可以將數據添加到C#應用程序和SQL Server 2005中的數據庫的權限。SQL添加數據的權限以及如何驗證?

我需要解釋,但要清楚。我們舉一個例子:

我有兩個用戶BobJim,這兩個用戶都已經添加到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%擔心用戶注入惡意數據,儘管這樣做會很好,但這是一個內部工具,我克我可以信任用戶......(可能)

無論哪種方式,我不知道從哪裏開始,我的SQL技能非常缺乏。

Akk,最後一件事,我不想使用存儲過程添加數據。

+0

您需要直接查詢SQL Server權限元數據。有一些可以調用的存儲過程會執行此操作,但我似乎記得這不是一項簡單的任務。 – 2009-06-07 18:34:52

回答

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(); 

最後一點,清洗你輸入。在您的應用程序中使用參數,並且不相信任何用戶,即使是內部用戶。我無法強調這一點。

編輯:因爲有不止一種方法更對皮膚一隻貓,我覺得我的愚蠢到不包括LINQ to 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

太棒了,雖然我對代碼沒有那麼糟糕,但如果檢查權限然後繼續是正確的方法,那更多。看起來不錯,這幾乎涵蓋了我的期望。謝謝。 – 2009-06-07 21:24:02

3

This article對使用​​特定權限保護應用程序的各種方法進行了說明。值得一讀的是系列的其餘部分,以及之前的ASP.NET 2.0系列,以瞭解所使用的架構。

+0

一篇關於如何將SQL Server ASP.NET成員資格提供程序添加到網站的好文章 - 但它使用代碼來驗證在授予執行任務權限之前的角色成員資格。問題的癥結在於,SQL Server安全性本身用於授予或拒絕對數據庫的權限 - 而C#代碼需要確定這些權限是什麼。 – 2009-06-07 18:38:40

+0

這是非常有用的,因爲我還需要一些asp.net控件。唯一的問題是,對於這個問題,它有點偏離主題。 – 2009-06-08 00:41:11

1

從可用性的角度來看,我想知道在用戶界面中管理可編輯性會不會更友好。作爲一個用戶,如果我輸入數據,並給我一個消息,說我沒有權限做這個條目,我不會被鼓勵繼續參與你的網站。

如果用戶無法向數據庫添加任何條目,則可以顯示只讀頁面(或DIV)。有權保存新條目的用戶將獲得可編輯頁面/ DIV。

對於允許保存某些類別的信息而不是其他的用戶,是否可以通過使用下拉列表來限制該類別中的條目?例如,Bob的發佈者下拉列表顯示MSPress,Jim的列表包含O'Reilly。這樣,他們可以從這些清單中清楚地看到他們在嘗試添加數據之前被允許執行的操作。權限不是祕密,隱藏在用戶面前。

相關問題