【问题标题】:aspnet 5 (MVC6) Windows Auth + roles + Authorize attributeaspnet 5 (MVC6) Windows 身份验证 + 角色 + 授权属性
【发布时间】:2016-01-12 14:44:38
【问题描述】:

我有一个在 aspnet 5 MVC 6 上使用 Windows Auth 的应用程序(obv 使用 IIS + IISPlatformHandler)

如何限制 AD 组对控制器的访问?

我已尝试执行以下操作,但它不起作用 :( 当我查看我的用户声明时,我看到许多组和声明看起来像 SID 的前任。{S-1-5-4}

[Authorize(Roles = "DOMAIN\\GROUP")
public class myController : Controller{...}

【问题讨论】:

  • 您是否尝试迭代与用户主体对象关联的声明。我不确定 Windows 身份验证是否会这样做,但对于其他所有信息,都将作为声明获得...

标签: asp.net-core-mvc


【解决方案1】:

截至 2016 年 7 月,我发现以下内容现在适用于 .NET Core RTM (WebAPI):

[Authorize(Roles = @"DOMAIN\Group")]

这里是 project.json 依赖项,以防您还想测试:

{
  "title": "My App",
  "copyright": "2016",
  "description": "WebAPI",
  "dependencies": {
    "Microsoft.AspNetCore.Mvc": "1.0.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },
    "Newtonsoft.Json": "9.0.1",
    "NLog.Extensions.Logging": "1.0.0-rtm-alpha2"
  },

【讨论】:

    【解决方案2】:

    问题在于 DNX 中没有 system.DirectoryServices。我已经在以下 github 问题上开始了讨论。

    https://github.com/aspnet/Home/issues/1232#issuecomment-171264286

    【讨论】:

      【解决方案3】:

      我们不得不用当前的 RC1 位来处理这个问题,并尽量减少自定义,因为看起来事情有望在 RC2 中得到修复。我们最终做的是创建一个常量类,其中包含我们关心的 AD 组名称作为变量,然后暂时,常量的值是 SID。在我们的代码中,我们使用常量而不是硬编码角色的 SID 值。这样,当将来修复问题时,我们可以只更改常量的值(将 sid 替换为组名),而不是通过所有控制器进行搜索和替换。我们最后还编写了一个简单的 API,以便我们可以撤回所有 Name/Sid 关联。代码是

      [HttpGet("[action]")]
      public List<Tuple<string, string>> GetSids()
      {
          List<Tuple<string, string>> results = new List<Tuple<string, string>>();
      
          using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
          {
              using (GroupPrincipal gp = new GroupPrincipal(pc))
              {
                  using (PrincipalSearcher searcher = new PrincipalSearcher(gp))
                  {
                      foreach (var found in searcher.FindAll())
                      {
                          if (found is GroupPrincipal)
                          {
                              results.Add(new Tuple<string, string>(found.Name, found.Sid.Value));
                          }
                      }
                  }
              }
          }
          return results;
      }
      

      【讨论】:

        【解决方案4】:

        我刚刚遇到了一个非常相似的情况,我们的角色和授权级别将大大偏离 ASP.NET 本身可以提供的内容。因此,我们构建了自己的继承自 AuthorizeAttribute 的自定义属性,并且效果非常好!

        我没有使用 AD 组件的经验,但幸运的搜索显示该开发人员做到了:

        http://ricardodsanchez.com/2013/05/24/how-to-use-active-directory-groups-to-restrict-access-to-controller-actions-in-asp-net-mvc-and-make-your-application-even-more-secure/

        他的代码看起来直截了当,除了广告部分似乎和我们正在工作的一样。

        需要注意的一点:当前的最佳授权实践是授权策略。但即使是最巧妙地使用该模式,我怀疑也会让您轻松进入 AD。如果您好奇,可以查看建议的方法here

        【讨论】:

        • 此解决方案适用于 MCV 5 或更低版本吗?它不适用于 MVC 6。作者正在请求 MVC 6 的帮助,而不是 ASP.NET / MVC 的较低版本。
        • 我上面的回答中链接“here”中的文档标题明确指出它适用于 MVC 6。是的,目前的做法是使用另一种方法,但这并不意味着它做不到。它可以并且确实适用于 Asp.Net 5 MVC 6。
        猜你喜欢
        • 2021-06-16
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        • 2019-10-04
        • 2012-01-14
        • 2020-05-23
        相关资源
        最近更新 更多