2009-06-07 81 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。这样,他们可以从这些清单中清楚地看到他们在尝试添加数据之前被允许执行的操作。权限不是秘密,隐藏在用户面前。

相关问题