ASP.NET Core 通过 web.config 授权 AD 组

17

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

<authorization> 
  <allow roles="Domain\MyADGroupToHaveAccess" />
  <deny users="*" /> 
</authorization> 

在.NET Core 2.0中,这将不起作用 - 它会正确拒绝匿名用户,但不论如何都会授权所有用户。

如果我这样做:

[Authorize(Roles = "Domain\\MyADGroupToHaveAccess")]

在我的HomeController上它能工作,但我不想在我的项目中硬编码这个设置,因为这是需要为其他环境更改的东西。

我该如何让web.config与AD授权一起使用?或者在ASP.NET Core中有没有另一种不硬编码这个设置的方法?


你好。如果我理解正确的话,那么我应该能够在AD中创建一个组(也称为OU?),然后通过引用相同的组/OU在属性[Authorize(Role="MyADGroup")]中,AD管理员或OU组代表可以添加/删除/修改组成员,并有效地授予对我的控制器的访问权限,是吗?如果这不正确,那么我错过了什么?请参见我的问题:https://stackoverflow.com/questions/50498225/how-to-bind-authorization-of-asp-core-controller-to-an-ou?noredirect=1#comment88009352_50498225 - Adam Cox
3个回答

31

我解决了这个问题,通过将其制作成一个可以调用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):
"SecuritySettings": {
  "ADGroup": "YourDomain\\YourADGroup"
}

在你的控制器中,你可以使用该属性进行装饰:

[Authorize(Policy = "ADRoleOnly")]

希望这能帮助其他人。

我仍然需要弄清如何在全局应用此策略,以便不必为每个控制器授权,我认为可以在 services.AddMvc 中实现?


@Mostafa,你对Morten提供的代码有什么问题吗?它完美地运行了。 - sam
这是一篇关于如何默认应用到控制器的写作:https://joonasw.net/view/apply-authz-by-default - Aage
您如何允许通过多个AD组成员身份访问(而不仅仅是一个)?您会创建几个角色还是几个策略?当您添加AuthorizeFilters时,它们是作为“或”还是“和”添加的? - RagingRoosevelt

7
为了进一步阐述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));
});

AppSettings.json:

"AuthorizedAdUsers": [
"domain\\groupname"
],

那么GenerateLetterAdUser将是另一个需要添加的策略?它将在AppSettings.json中有另一个条目来保存相关的组名? - Mike
1
GenerateLetterAdUser将是Active Directory中的一个组,您可以将用户映射到AD组中。因此,domainname \ generateletteraduser将是使用方式。因此,在appsettings.json中映射所有要在应用程序中使用的组,在AD中将用户映射到这些组。这将使其同时使用AD和.net core角色和策略。 - sam

0

我能够使用以下方法重现 web.config 设置:

Program.cs 文件中:

builder.Services.AddAuthorization(options => {
    builder.Configuration.GetSection("SecuritySettings").GetChildren().ToList().ForEach(
        ss => options.AddPolicy(ss.Key, policy => policy.RequireRole(ss.Value))
    );

    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .RequireRole(new string[] { builder.Configuration["SecuritySettings:Access"] })
        .Build();
});

appsettings.json 文件中:
"SecuritySettings": {
  "Access": "YourDomain\\YourADGroup"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接