使用Intranet应用程序的用户角色的最佳方法

时间:2011-05-03 18:54:00

标签: asp.net-mvc-3 roles

我正在开发一个ASP.NET MVC Intranet网站,它需要有一些不同的用户角色(管理员,编辑器,编写器等),后端使用SQL Server。我阅读了scottgu关于基于角色的安全性的this post,并将其作为起点。我遵循的步骤是:

使用asp_regsql.exe应用程序配置数据库 将身份验证模式设置为Windows

<authentication mode = "Window" />

在Web.config中添加了一个连接字符串条目,

<connectionStrings>
  <add name="SqlRoleManagerConnection" 
       connectionString="Data Source=localhost; Initial Catalog=aspservicedb; Integrated Security=SSPI;" />
</connectionStrings>

在Web.config部分添加了一个roleManager条目,

<roleManager enabled="true" defaultProvider="sqlRoleManager">
  <providers>
    <clear />
    <add name="sqlRoleManager" type="System.Web.Security.SqlRoleProvider"
         connectionStringName="SqlRoleManagerConnection"
         applicationName="MyApplication" />
  </providers>
</roleManager>

在Global.asax.cs文件的Application_Start()方法中添加了一些角色代码,

if (!Roles.RoleExists("Editor"))
{
   Roles.CreateRole("Editor");
}
if (!Roles.RoleExists("Writer"))
{
   Roles.CreateRole("Writer");
}
if (!Roles.RoleExists("SiteAdmin"))
{
   Roles.CreateRole("SiteAdmin");
   Roles.AddUserToRole("MYCOMPUTER\\Matt", "SiteAdmin");
}

修改我的控制器以使用角色:

[Authorize(Roles = "SiteAdmin")]
public class SiteAdminController : Controller
{
    .
    .
    .
}

这一切似乎都在这一点上起作用,但我想知道是否有更好的方法来处理角色或者这种方法是否存在问题。很容易说服自己这种方法很好,因为它有效,但我想采用不同的方法现在而不是后来如果这不是解决问题的最佳方法。在其他地方,我读过有人说这是“黑客”,但从来没有真正合格为什么他不会这样解决问题。你的意见?你有更好的解决方法吗?

2 个答案:

答案 0 :(得分:3)

在我的一些生产MVC应用程序中,我只使用内置的sql角色提供程序。它开箱即用,您的MVC3模板将配置为已使用它。只需从Visual Studio中打开管理站点并管理安全性并将角色,用户,用户添加到角色等等。不要使用你的web.config来管理哪些角色可以访问哪些URI,这已经被推荐一遍又一遍地远离MVC,因为多个uri可能会到达一条路由,所以你使用(就像你做的那样) )Authorize属性与自动角色管理相结合,这就是你所需要的。这很简单。

答案 1 :(得分:2)

有两个值得一提的备选方案:

  1. 在Web配置中配置基于角色的安全性。这会集中安全配置,但必须更新以镜像您的路径/路由,因此需要进行一些手动维护。
  2. 在数据库中配置基于角色的安全性,并创建自定义操作筛选器以根据登录用户读取,缓存和应用这些角色。这是动态的,但需要更多一些,因为您可能需要创建一个管理界面来编辑配置。
  3. 如果您需要这些示例,请告诉我,我可以链接您。