Authentication ASP.NET MVC4安全、身份验证和授权

Authentication ASP.NET MVC4安全、身份验证和授权,authentication,security,asp.net-mvc-4,Authentication,Security,Asp.net Mvc 4,我正在使用Visual Studio 2011 beta开发一个新的asp.net mvc4项目,并试图了解整个安全问题。它是一个内部Intranet应用程序,最初将使用单点登录,因此不会(尚未)提示用户输入Windows ID/密码。该公司有一个自定义应用程序,用于存储不同应用程序的角色,并将通过存储过程调用提供。它将获取用户的登录ID并返回某种包含角色的集合,例如“MyApp.Data”、“MyApp.user”、“MyApp.Admin”。那么这被称为什么-这是自定义成员资格提供程序、自定

我正在使用Visual Studio 2011 beta开发一个新的asp.net mvc4项目,并试图了解整个安全问题。它是一个内部Intranet应用程序,最初将使用单点登录,因此不会(尚未)提示用户输入Windows ID/密码。该公司有一个自定义应用程序,用于存储不同应用程序的角色,并将通过存储过程调用提供。它将获取用户的登录ID并返回某种包含角色的集合,例如“MyApp.Data”、“MyApp.user”、“MyApp.Admin”。那么这被称为什么-这是自定义成员资格提供程序、自定义角色提供程序还是其他什么

我一直在阅读授权、身份验证、成员资格、角色等方面的所有细节,目前我看不到实情。我已经了解到,现有的ASP.NET安全对象已经过尝试和测试,除非有非常复杂的需求,否则内置的就足够了,所以我很乐意使用它准备好了

因此,如果用户已经登录到网络,这意味着他们已通过身份验证-正确吗?如果是,那么我只需要实现授权。是否有必要使用Authorize属性来修饰每个控制器或操作?如果是,那么[Authorize(Roles=“ABC”)的“ABC”部分如何处理如果从自定义角色存储应用检索角色,是否设置

我读了几篇文章和博客文章,包括Jon Galloway的这篇文章,但最后我迷路了:


这么多问题……如果有人知道所有这些是如何联系在一起的,那么我洗耳恭听:)

如果您的身份验证已经由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.Identityty应该是

Ok的一个例子,因为没有一个答案可以从更高的层次来解释这一切是如何联系在一起的,我想我应该把我的发现写下来:

  • 该公司使用Active Directory存储用户登录详细信息,因为这是用于会员身份,所以我不需要自定义会员身份提供商。用户登录到公司网络后,将对其进行身份验证。添加全局授权筛选器可确保任何访问系统的用户都需要进行身份验证。最新信息frmsdn上的om Rick Anderson:

因此,在Global.asax中,我要补充:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new System.Web.Mvc.AuthorizeAttribute()); //new
}
  • 一旦用户通过身份验证,我就需要负责授权。该公司有一个现有的全局数据存储,用于我没有更新权限的角色,只有读取权限,因此我可以通过存储过程调用检索给定用户的角色。帮助台可能需要几天到几周的时间来创建角色请求已发出,因此最初将创建2个标准角色:用户和管理员,随后的角色将存储在我们的应用程序数据库中

  • 除了这两个标准角色外,还需要后续角色,如超级用户等。这些角色将根据业务规则等拥有各种权限,并且需要存储在我们的应用程序数据库中。因此,对于此场景,我需要创建自定义角色提供器,将适当的asp.net角色表添加到我的应用程序数据库中nd将其插入web.config。下面是一个名为“使用角色管理授权”的ms页面,我从中挑选了一些内容:

  • 根据我目前所读的内容,定制角色提供程序所需的唯一表是Roles和UsersInRoles

    创建表角色 ( Rolename文本(255)不为空, ApplicationName文本(255)不为空, 约束PKRoles主键(Rolename,ApplicationName) )

    创建表UsersInRoles ( 用户名文本(255)不为空, Rolename文本(255)不为空, ApplicationName文本(255)不为空, 约束PKUsersInRoles主键(用户名、角色名、应用程序名) )

  • 设置完毕后,我需要弄清楚如何将全局数据存储中的2个标准角色(用户和管理员)与存储在我的应用程序数据库中的自定义角色合并,以及我是否可以在控制器/操作上使用(例如)[Authorize(roles=“Admin,Superuser”)],或者我是否需要对authorizeAttribute进行子类化并执行更巧妙的操作

  • 我刚刚意识到,当我使用AD进行身份验证时,我需要一种添加/注入当前用户所属角色集合的方法。因此,尽管我不需要任何自定义成员资格提供程序功能,但我仍然必须与httpContext.user交互以更新其角色集合


您的RolePrincipal(与您的RoleProvider一起更新)应该是获取与经过身份验证的用户关联的角色列表所需的全部。请记住,RolePrincipal将已经包含正确的WindowsIdentity

您不需要自定义授权属性。RolePrincipal/RoleProvider将获取所需的角色并使用标准授权属性

看起来有点奇怪的是,您希望拥有应用程序特有的角色,但您说您还希望从单独的公司应用商店中获得与Windows用户关联的角色。正如您所说,您希望合并这些角色。这似乎不适合m