aspnet 5(MVC6)Windows Auth +角色+授权属性

时间:2016-01-12 14:44:38

标签: asp.net-core-mvc

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

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

我尝试过做类似以下的事情,但它不会起作用:(当我看到我的用户声称时,我看到许多团体和声称看起来像SID的前身。{S-1- 5-4}

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

4 个答案:

答案 0 :(得分:4)

截至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"
  },

答案 1 :(得分:1)

这个问题是DNX中没有system.DirectorySevices。我已经开始讨论以下github问题了。

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

答案 2 :(得分:0)

我们不得不用当前的RC1位处理这个问题,并试图最小化自定义,因为它看起来好像有希望在RC2中修复。我们最终做的是创建一个Constants类,它具有我们关注的AD组名称作为变量,然后暂时,常量的值是SID。在我们的代码中,我们然后使用常量而不是对角色的SID值进行硬编码。这样,当事情在未来得到修复时,我们就能够为常量更改值(用组名替换sids),而不是通过所有控制器进行搜索和替换。我们最终编写了一个简单的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;
}

答案 3 :(得分:-1)

我刚遇到一种非常类似的情况,我们的角色和授权级别会大大偏离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片段似乎就像我们工作的那样。

有一点需要注意:目前授权的最佳做法是授权政策。但即使是最聪明地使用这种模式,我怀疑会让你轻松通往AD。如果您有点好奇,可以看到建议的方法here