【问题标题】:Security toolkit for ASP.Net MVCASP.Net MVC 的安全工具包
【发布时间】:2016-07-30 01:40:56
【问题描述】:

我实际上是在用 NHibernate 和 ASP.Net MVC 开发一个网站 我需要管理组、页面和其他一些东西的权限 我希望我的角色、权限、操作、组和所有类似的东西都在我的数据库中。

像旧的post 一样,我想知道 Ayende Rhino Security 工具包是否仍然相关,或者是否还有其他相关的通用工具包?

【问题讨论】:

    标签: c# asp.net-mvc security nhibernate permissions


    【解决方案1】:

    对于我的新项目,我使用了身份系统

    http://www.asp.net/identity

    ASP.NET 身份系统旨在取代以前的 ASP.NET 成员资格和简单成员资格系统。它包括配置文件支持、OAuth 集成、与 OWIN 一起使用,并包含在 Visual Studio 2013 附带的 ASP.NET 模板中。

    尤其是这个教程第一次帮助了我很多

    http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-1

    【讨论】:

    • 而且我认为使用 NHibernate 不会有问题。
    • 我已经将 ASP.Net 身份系统与我的解决方案集成,但我需要像 Ayende Rhino Security 这样的扩展权限工具包,它可以管理我的组、权限、操作...等
    • 好的,所以,我在我的上一个项目中实现了一些功能,其中我有角色和 AccessLevels,我为类控制器和每个控制器的访问级别使用角色。1 个用户可以有 1 个角色和多个访问级别。我有一个名为“General”的访问级别,分配给每个人,另一个名为“MoneyGuy”,只有特定的一群人才能拥有
    • 事情是,我重写了 System.Security.Claims AuthorizeCore 和 OnAuthorization 的一些功能,它实际上非常简单(不超过 10 行代码),最后我的方法有一些东西像这样 [BMClaimsAuthorize("AccessLevel", "General")]
    • 是的,每个角色和访问级别都存储在数据库中,如果您认为有帮助,我可以将代码发送给您
    【解决方案2】:

    您也可以考虑MembershipReboot。据我所知,它仍然超出了 Asp.Net Identity,尽管它最初是为了克服成员资格的缺点。

    关于Rhino Security toolkit,不知道是什么状态。

    【讨论】:

      【解决方案3】:

      这是我所做的一个例子

      第 1 步 - 为用户创建声明

      var identity = new ClaimsIdentity(
          new[] {
                  new Claim(ClaimTypes.Name, usr.Name),
                  new Claim(ClaimTypes.Email, usr.Email),
                  new Claim(ClaimTypes.Role, usr.Roles.FirstOrDefault().Role),
                  new Claim("StuffXId", usr.StuffXId + ""),
                  new Claim("StuffYId", usr.StuffYId + "")
      
          }
          , "BMMC"//"ApplicationCookie"
      );
      
      foreach(AccessLevels x in usr.AccessLevels)
          identity.AddClaim(new Claim("AccessLevel", x.Access));
      

      第 2 步 - 我创建了我的类 BMClaimsAuthorize

      public class BMClaimsAuthorize : AuthorizeAttribute
      {
          public string ClaimType { get; set; }
          public string Value { get; set; }
      
          public BMClaimsAuthorize() { }
      
          public BMClaimsAuthorize(string ClaimType, string Value)
          {
              this.ClaimType = ClaimType;
              this.Value = Value;
          }
      
          protected override bool AuthorizeCore(HttpContextBase context)
          {
              return context.User.Identity.IsAuthenticated
                  && context.User.Identity is ClaimsIdentity
                  && ((ClaimsIdentity)context.User.Identity).HasClaim(x =>
                      x.Type == ClaimType && x.Value == Value);
      
          }
      
          public override void OnAuthorization(AuthorizationContext filterContext)
          {
              base.OnAuthorization(filterContext);
      
              if (filterContext.Result is HttpUnauthorizedResult)
                  filterContext.Result = new RedirectResult("~/Account/DeniedAccess");
      
          }
      
      }
      

      3 - 使用 peject.BMTools(导入我的库)

      [BMClaimsAuthorize("AccessLevel", "General")]
      public ActionResult Index()
      {
          ViewBag.Name = CurrentUser.Name;
          ViewBag.Email = CurrentUser.Email;
          ViewBag.StuffX = CurrentUser.ValueOf("StuffXId");
          return View();
      }
      

      我创建了自己的控制器类(继承自控制器),帮助我轻松获得用户声明

      CurrentUser.Name
      

      但那是另一个话题了..

      这是我的实际代码,我有 2 个表,其中用户被映射到一个角色和访问级别

      角色只告诉他们是否是管理员(保存为表格而不是用户字段,以防我以后需要多个角色),它们位于只有管理员可以访问的控制器类的顶部。

      AccessLevel 告诉其他一切(它们按方法过滤)。如果您需要更复杂的东西,您可以添加更多声明(作为我的 AccessLevel 声明)并编辑 BMClaimsAuthorize 和 AuthorizeCore 方法以满足您的条件。

      例如让它接受一个字符串数组,所以你发送这样的东西

      [BMClaimsAuthorize("AccessLevel", {"General","Admin","other"...})]
      

      希望这会有所帮助!

      【讨论】:

      • 是的,在我的示例中,用户可以拥有多个访问级别,这意味着他们可以成为多个组的一部分
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多