我正在使用Visual Studio 2011测试版开发一个新的asp.net mvc4项目,并试图让我了解整个安全问题。它是一个内部Intranet应用程序,最初将使用单点登录,因此不会(还)提示用户输入Windows ID /密码。该公司有一个自定义应用程序,用于存储不同应用程序的角色,并可通过存储过程调用获得。它将获取用户的登录ID并返回某种包含角色的集合,例如“MyApp.Data”,“MyApp.User”,“MyApp.Admin”。那么这被称为 - 这是一个自定义成员资格提供者,自定义角色提供者还是别的什么?
我一直在阅读授权,身份验证,会员资格,角色等所有细节,我现在看不到树木。我已经读过现有的ASP.NET安全对象已经过试用和测试,除非有非常复杂的要求,否则内置的对象就足够了,所以我很乐意使用现有的内容。
因此,如果用户已登录网络,则表示他们已通过身份验证 - 是否正确?如果是这样,那么我只需要实现授权。是否有必要使用Authorize属性修饰每个Controller或Action?如果是这样,如果我从自定义角色存储应用程序中检索角色,那么[Authorize(Roles =“ABC”)]的“ABC”部分如何设置?
我从Jon Galloway那里读了几篇文章和博客文章,但我最后迷路了:
Customizing Authentication and Authorization The Right Way
这么多问题......如果有人知道如何将所有这些挂在一起的高级别描述那么我就是全部的耳朵:)
答案 0 :(得分:8)
好的,如果没有答案能够高度评价这一切是如何挂起来的,那么我认为到目前为止我已经删除了我的调查结果:
该公司使用Active Directory存储用户登录详细信息,因此这用于成员资格我不需要自定义成员资格提供程序。用户登录公司网络后,即可对其进行身份验证。添加全局授权过滤器可确保需要对访问系统的任何用户进行身份验证。来自msdn的Rick Anderson的最新信息:
所以在Global.asax中我会添加:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new System.Web.Mvc.AuthorizeAttribute()); //new
}
用户通过身份验证后,我需要处理授权。该公司有一个现有的全局数据存储,用于我不具有更新访问权限的角色,只有读访问权限,因此我可以通过存储的proc调用检索给定用户的角色。在请求发出后,帮助台可能需要几天到几周的时间来创建角色,因此最初会创建2个标准角色,User和Admin以及后续角色将存储在我们的应用程序数据库中。
除了这两个标准角色之外,还需要后续角色,例如超级用户等。这些角色将根据业务规则等具有各种权限,并且需要存储在我们的应用程序数据库中。因此,对于这种情况,我需要创建一个自定义角色提供程序,将相应的asp.net角色表添加到我的app数据库,然后将其插入web.config。这是一个名为“使用角色管理授权”的ms页面,我选择了以下内容:
从我到目前为止所读到的,自定义角色提供程序所需的唯一表是Roles和UsersInRoles。
CREATE TABLE角色 ( Rolename文本(255)NOT NULL, ApplicationName Text(255)NOT NULL, CONSTRAINT PKRoles PRIMARY KEY(Rolename,ApplicationName) )
CREATE TABLE UsersInRoles ( 用户名文本(255)NOT NULL, Rolename文本(255)NOT NULL, ApplicationName Text(255)NOT NULL, CONSTRAINT PKUsersInRoles PRIMARY KEY(用户名,Rolename,ApplicationName) )
一旦完成所有这些设置,我需要弄清楚如何将全局数据存储中的2个标准角色(用户和管理员)与存储在我的应用数据库中的自定义角色合并,如果我可以使用(例如)[在Controller / Action上授权(Roles =“Admin,Superuser”)]或者如果我需要继承AuthoriseAttribute并做一些更聪明的事情。
我刚才意识到,当我使用AD进行身份验证时,我需要一种添加/注入当前用户所属角色集合的方法。因此,虽然我不需要任何自定义成员资格提供程序功能,但仍需要与httpContext.User进行交互以更新其Roles集合。
答案 1 :(得分:7)
如果您的身份验证已经由Windows处理(我通过Active Directory进行猜测),那么您正在寻找的是一种将角色与用户匹配的授权机制。您拥有的一个选项是成功将用户角色加载到当前会话中。然后创建一个自定义授权属性,该属性将检查当前会话是否具有您正在使用的必要角色
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited=true, AllowMultiple=true)]
public class CustomAuthorizationAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated)
{
return false;
}
//check your users against a database and return true or false
return base.AuthorizeCore(httpContext);
}
}
然后你可以使用像这样的属性
[CustomAuthorization]
public ActionResult SomeAction()
{
return View();
}
<强>更新强>
AuthorizeCore是用于检查是否应允许此用户访问相应操作方法的方法。在此方法中,您可以针对数据库或存储角色的位置检查httpContext.User.Identity.Name属性。如果您通过Active Directory使用Windows身份验证,则HttpContext.User.Identity应为WindowsIdentity的实例
答案 2 :(得分:1)
与RoleProvider一起更新的RolePrincipal应该是获取与经过身份验证的用户关联的角色列表所需的全部内容。请记住,RolePrincipal已经包含正确的WindowsIdentity。
您不需要自定义Authorize属性。 RolePrincipal / RoleProvider将获取所需的角色并使用标准的Authorize属性。
看起来有点奇怪的是,您希望拥有应用程序特有的角色,但您说您还希望从单独的公司商店中获得与Windows用户相关联的角色。如你所说,你想合并它们。这对我来说似乎不对。您希望在应用程序的企业级别管理角色,或者您希望在本地级别管理角色。一般来说,你不会同时做到这两点。
但是,如果这确实是您想要做的,那么听起来好像您的RoleProvider需要进行服务(例如WCF)调用或AD调用以获取其他信息。也许windows用户所属的“组”的名称可以充当“角色”。然后,您只会筛选出您的应用程序关注的组,并与您在本地角色数据库中找到的角色结合使用。
收集完所有信息后,请确保指示roleManager将角色信息存储在cookie中。根据用户提出的每一个请求,都没有意识到这种喧嚣。