【发布时间】:2011-01-29 22:52:29
【问题描述】:
是否可以在运行时配置 ASP.NET MVC 中的安全性?例如,如果我有一个控制器被标记为
[Authorize(Roles="Admin")]
有没有办法在运行时添加/删除角色?或者,你必须在代码中更改它并重新编译吗?
【问题讨论】:
标签: asp.net-mvc security configuration permissions
是否可以在运行时配置 ASP.NET MVC 中的安全性?例如,如果我有一个控制器被标记为
[Authorize(Roles="Admin")]
有没有办法在运行时添加/删除角色?或者,你必须在代码中更改它并重新编译吗?
【问题讨论】:
标签: asp.net-mvc security configuration permissions
是的,您必须提供自己的 IPrincipal 实现,以实现这一点。 Authorize 方法所做的只是调用 User.IsInRole("Admin") 方法。
【讨论】:
如果您想构建自定义的东西,您可以创建自己的自定义授权方案。
看看 AuthorizeAttribute - 这里是an article,它对两种机制进行了简单的比较。
【讨论】:
我想您需要这种功能,因为您正在运行时添加新角色,并且您正试图将它们连接到您的应用程序提供的功能。如果我的想法是正确的,您还必须在某处(在数据库或注册表或配置文件中)存储功能列表。鉴于这一切,我相信您将用户置于角色中并将角色附加到功能上,然后将这些关系存储在数据存储中。
因此,考虑到所有这些,您可能希望为您的操作提供一个自定义属性(装饰器),它会说类似
[AuthorizeUsers]
而不是
[Authorize(Roles="Admin")]
所以发出对任何类型角色的任何引用,而是进入数据存储并枚举所有关系并检查所有角色/用户及其,我应该说,权限。然后您要么拒绝他们的请求(例如,将他们返回到他们有权访问的另一个视图),要么给他们一个选择权限的选项(就像 SharePoint 在您访问您无权访问的部分页面时所做的那样)。
有关如何创作自定义授权的确切代码示例,请转到 ASP.NET MVC 源代码 - System.Web.Mvc 命名空间。
HTH
【讨论】: