C# ASP.NET核心通过web.config授权广告组

C# ASP.NET核心通过web.config授权广告组,c#,asp.net-core,active-directory,asp.net-core-2.0,C#,Asp.net Core,Active Directory,Asp.net Core 2.0,在我以前的.NETMVC应用程序中,我可以在IIS中启用Windows身份验证并禁用匿名。然后在我的web.config文件中,我只需要输入以下内容: 在.NET Core 2.0中,这将不起作用-它正确地拒绝匿名,但它授权所有用户,不管发生什么 如果我这样做: [Authorize(Roles = "Domain\\MyADGroupToHaveAccess")] 在我的HomeController上,它可以工作,但我不想在我的项目中硬编码此设置,因为它需要在其他环境中更改 如何使web

在我以前的.NETMVC应用程序中,我可以在IIS中启用Windows身份验证并禁用匿名。然后在我的
web.config
文件中,我只需要输入以下内容:


在.NET Core 2.0中,这将不起作用-它正确地拒绝匿名,但它授权所有用户,不管发生什么

如果我这样做:

[Authorize(Roles = "Domain\\MyADGroupToHaveAccess")]
在我的
HomeController
上,它可以工作,但我不想在我的项目中硬编码此设置,因为它需要在其他环境中更改


如何使
web.config
与广告授权一起工作?或者有没有其他方法不在ASP.NET Core中硬编码此设置?

我将其制作成一个能够调用
appsettings.json的策略,从而解决了这个问题。这样,其他有权访问服务器的人就可以将该组编辑为自己的组

Startup.cs
中:

services.AddAuthorization(options =>
{
    options.AddPolicy("ADRoleOnly", policy => policy.RequireRole(Configuration["SecuritySettings:ADGroup"]));
});

services.AddMvc(config =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();

    config.Filters.Add(new AuthorizeFilter(policy));
});
appsettings.json
中(或者如果您有不同的设置,也可以在
appsettings.production.json
中):

然后,在控制器中,可以使用以下属性对其进行装饰:

[Authorize(Policy = "ADRoleOnly")]
希望这能帮助其他人


我还需要弄清楚如何在全球范围内应用此策略,因此我不必授权每个控制器,我想可以在
服务中完成。AddMvc
以某种方式?

要扩展Morten_564834的答案,下面是我们解决此问题的方法。创建所有控制器从中继承的基础控制器

[Authorize(Policy = "AdUser")]
public class FTAControllerBase : Controller
{
    private readonly ApplicationDbContext _db;
    private readonly ILogHandler _logger;

    public FTAControllerBase(ApplicationDbContext DbContext, ILogHandler Logger, IWindowsAccountLinker WinAccountLinker)
    {
        _db = DbContext;
        _logger = Logger;

        /// get registered user via authenticated windows user.
        //var user = WinAccountLinker.LinkWindowsAccount();
    }
}
然后在其他控制器中:

public class LettersController : FTAControllerBase
{ ... }
如果您希望对方法具有粒度权限,请执行以下操作:

[Authorize("GenerateLetterAdUser")]
[HttpGet]
public IActionResult Generate()
{
    return View();
}
Startup.cs:

// add authorization for application users
var section = Configuration.GetSection($"AuthorizedAdUsers");
var roles = section.Get<string[]>();
services.AddAuthorization(options =>
{
    options.AddPolicy("AdUser", policy => policy.RequireRole(roles));
});

你好如果我理解正确,那么我应该能够在AD中创建一个组(也称为OU?),然后通过在属性[Authorize(Role=“MyADGroup”)]中引用相同的组/OU,那么AD管理员或OU组代表可以添加/删除/修改组成员并有效地授予对我的控制器的访问权限,是吗?如果这是不正确的,那么我遗漏了什么?请看我的问题:@Mostafa您对Morten提供的代码有什么问题?这是一篇关于如何在默认情况下将其应用于控制器的文章:您将如何允许通过几个广告组中的任何一个(而不是一个)的成员身份进行访问?你会创建几个角色吗?还是几种政策?当您添加授权筛选器时,它们是作为
添加的吗?因此,GenerateLetterAdUser将是需要添加的另一个策略?它将在AppSettings.json中有另一个条目来保存相关的组名?GenerateLetterAdUser将是Active Directory中的一个组,您将用户映射到AD组。因此,domainname\\generateletteraduser将是用法。因此,您可以在appsettings.json中映射要使用的所有组,在AD中,将用户映射到这些组。这将使它同时使用AD和.net核心角色和策略。
// add authorization for application users
var section = Configuration.GetSection($"AuthorizedAdUsers");
var roles = section.Get<string[]>();
services.AddAuthorization(options =>
{
    options.AddPolicy("AdUser", policy => policy.RequireRole(roles));
});
"AuthorizedAdUsers": [
"domain\\groupname"
],