我正在使用 Visual Studio 2011 beta 开发一个新的 asp.net mvc4 项目,并试图了解整个安全问题。它是一个内部 Intranet 应用程序,最初将使用单点登录,因此用户(尚)不会被提示输入 Windows ID/密码。该公司有一个自定义应用程序,用于存储不同应用程序的角色,并且可以通过存储过程调用来使用。它将获取用户的登录 ID 并返回某种包含角色的集合,例如“MyApp.Data”、“MyApp.User、“MyApp.Admin”。那么这指的是什么呢?这是自定义会员资格提供程序、自定义角色提供程序还是其他内容?
我一直在阅读授权、身份验证、成员资格、角色等的所有来龙去脉,但目前我还只见树木不见森林。我读到现有的 ASP.NET Security 对象已经过尝试和测试,除非有非常复杂的要求,否则内置的就足够了,所以我很乐意使用已有的内容。
因此,如果用户已经登录到网络,这意味着他们已经通过身份验证 - 对吗?如果是这样,那么我只需要实施授权。是否有必要给每个Controller或Action都加上Authorize属性呢?如果是这样,如果我从自定义角色存储应用程序检索角色,[Authorize(Roles = "ABC")] 的“ABC”部分如何设置?
我读了几篇文章和博客文章,包括 Jon Galloway 的这篇文章,但最后我迷失了:
以正确的方式自定义身份验证和授权 http://weblogs.asp.net/jgalloway/archive/2012/05/04/asp-net-mvc-authentication-customizing-authentication-and-authorization-the-right-way.aspx
这么多问题......如果有人知道所有这些如何结合在一起的良好高级描述,那么我洗耳恭听:)
好吧,在没有一个答案可以从高层次上说明所有这些如何结合在一起的情况下,我想我应该写下到目前为止的发现:
-
该公司使用 Active Directory 来存储用户登录详细信息,因此由于它用于会员资格,所以我不需要自定义会员资格提供商。一旦用户登录到公司网络,他们就会通过身份验证。添加全局授权过滤器可确保访问系统的任何用户都需要经过身份验证。 Rick Anderson 在 msdn 上的最新信息:
http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous-attribute.aspx http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous-attribute.aspx
所以在 Global.asax 中我会添加:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new System.Web.Mvc.AuthorizeAttribute()); //new
}
一旦用户通过身份验证,我就需要处理授权。该公司有一个现有的角色全局数据存储,我没有更新访问权限,只有读取访问权限,因此我可以通过存储过程调用检索给定用户的角色。提出请求后,帮助台可能需要几天到几周的时间来创建角色,因此,最初将创建 2 个标准角色:用户和管理员,后续角色将存储在我们的应用程序数据库中。
-
除了这 2 个标准角色之外,还需要后续角色,例如超级用户等。这些角色将根据业务规则等拥有各种权限,并且需要存储在我们的应用程序数据库中。因此,对于这种情况,我需要创建一个自定义角色提供程序,将适当的 ASP.NET 角色表添加到我的应用程序数据库中,并将其插入到 web.config 中。这是一个标题为“使用角色管理授权”的 MS 页面,我从中挑选了一些内容:
http://msdn.microsoft.com/en-us/library/9ab2fxh0.aspx http://msdn.microsoft.com/en-us/library/9ab2fxh0.aspx
-
根据我到目前为止所读到的内容,自定义角色提供程序所需的唯一表是 Roles 和 UsersInRoles。
创建表角色
(
角色名称文本 (255) NOT NULL,
应用程序名称文本 (255) NOT NULL,
CONSTRAINT PKRoles PRIMARY KEY(角色名、应用程序名称)
)
创建表 UsersInRoles
(
用户名文本 (255) NOT NULL,
角色名称文本 (255) NOT NULL,
应用程序名称文本 (255) NOT NULL,
CONSTRAINT PKUsersInRoles 主键(用户名、角色名、应用程序名称)
)
一旦完成所有这些设置,我需要弄清楚如何将全局数据存储中的 2 个标准角色(用户和管理员)与存储在我的应用程序数据库中的自定义角色合并,以及是否可以使用(例如)[Authorize(Roles= “管理员,超级用户”)] 在控制器/操作上,或者如果我需要子类化 AuthoriseAttribute 并做一些更聪明的事情。
我刚刚意识到,当我使用 AD 进行身份验证时,我需要一种添加/注入当前用户所属角色集合的方法。因此,尽管我不需要任何自定义成员资格提供程序功能,但我仍然必须与 httpContext.User 交互以更新其 Roles 集合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)