我正在使用Visual Studio 2011测试一个新的asp.net mvc4项目,我试图让我周围的整个安全事头。 它是最初将使用单点登录的Intranet内部的应用程序,因此用户(还)没有被提示输入一个Windows ID /密码。 公司拥有用于存储不同的应用角色的自定义应用程序,将通过一个存储过程调用可用。 这将需要一个用户的登录ID,并返回某种含有的角色如“MyApp.Data”收集“,MyApp.User,‘MyApp.Admin’那么,什么是这个被称为 - 这是一个自定义的成员提供者,自定义角色供应商或其他什么东西?
我一直对所有的插件和授权,认证,成员,角色等的出局读书了,我不能见木此刻的树木。 我读过,现有的ASP.NET安全对象已经久经考验,除非有非常复杂的要求,内置的人就足够了,所以我很高兴能使用什么已经存在。
因此,如果用户已经登录到网络上,这意味着它们已通过认证 - 正确的吗? 如果是这样的话,我只需要实现授权。 是否有必要来装饰每个控制器或者动作与授权属性? 如果它是如何的“ABC”的一部分[授权(角色=“ABC”)得到,如果我检索我的自定义角色存储应用程序角色设置?
我读了几篇文章和博客文章包括本乔恩加洛韦但我迷路了接近尾声:
定制身份验证和授权的正确方法
这么多的问题,如果还有人的这一切是如何挂在一起,然后好高层次的描述知道我所有的耳朵:)
确定在没有答案,让的这一切是如何挂在一起,我想我会潦草了我的发现至今的高级视图的:
该公司使用Active Directory来存储用户登录信息,从而为这是用于会员我并不需要一个自定义的成员资格提供。 一旦用户登录到公司网络,然后他们进行身份验证。 添加全局授权过滤器可以确保在访问系统中的任何用户都需要进行身份验证。 最多从里克·安德森最新信息MSDN上:
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中。 这里的标题为管理授权使用我挑选出位的角色的毫秒页面:
http://msdn.microsoft.com/en-us/library/9ab2fxh0.aspx
从我至今读我需要一个自定义的角色提供的仅有的表就是角色和UsersInRoles。
CREATE TABLE角色(角色名称文本(255)NOT NULL,应用程序名称文本(255)NOT NULL,约束PKRoles PRIMARY KEY(角色名,应用程序名称))
CREATE TABLE UsersInRoles(用户名文本(255)NOT NULL,ROLENAME文本(255)NOT NULL,应用程序名称文本(255)NOT NULL,约束PKUsersInRoles PRIMARY KEY(用户名,角色名,应用程序名称))
一旦这一切都是建立我需要弄清楚如何将2个标准角色(用户和管理员)从存储在我的应用程序数据库中的自定义角色的全局数据存储合并,如果我可以使用(例如)授权(角色= “管理员,超级用户”)上的控制器/动作,或者如果我需要继承AuthoriseAttribute,做一些更聪明。
我意识到,我使用AD进行身份验证,我需要添加/注射角色的集合当前用户是其成员的一种方式。 所以,虽然我不需要任何自定义的成员提供的功能我还是要与HttpContext.User中进行交互,以更新其角色的集合。
如果您的认证已经被处理的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();
}
UPDATE
AuthorizeCore是将用于检查该用户是否应该被允许访问相应的操作方法,该方法。 在这个方法中,你可以检查你的数据库或者你的角色都存储在httpContext.User.Identity.Name财产。 如果你通过Active Directory使用Windows身份验证,HttpContext.User.Identity应该是一个实例的WindowsIdentity
你RolePrincipal,与您的RoleProvider演唱会更新,应该是所有需要取得与验证的用户相关联的角色列表。 请记住,RolePrincipal将已经包含了正确的WindowsIdentity。
你并不需要一个自定义的授权属性。 该RolePrincipal / RoleProvider将获取所需的角色,并与标准的授权属性工作。
什么似乎有点奇怪的是,你想拥有独特的角色,你的应用程序,但你说你也想与该Windows用户从一个独立的企业店以及相关联的角色。 正如你所说,你要合并。 这似乎不是我的权利。 无论是要管理在企业层面的角色为您的应用程序,或者你想在一个地方来管理它们。 一般来说,你不会做两个。
但如果真的是你想要做什么,那么它听起来好像你RoleProvider需要做出服务(如WCF)呼叫或呼叫广告,以获得更多的信息。 也许,“组”的名称是Windows用户属于可以充当“角色”。 然后,您可以筛选出只有那些应用程序关心群体,并与您在本地角色数据库中发现的角色结合起来。
一旦所有的信息已被收集,一定有roleManager指示存储角色信息的cookie。 在通过大喊大叫要与每一个没有意义的请求用户进行。