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

Mor*_*834 7 c# active-directory asp.net-core asp.net-core-2.0

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

<authorization> 
  <allow roles="Domain\MyADGroupToHaveAccess" />
  <deny users="*" /> 
</authorization> 
Run Code Online (Sandbox Code Playgroud)

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

如果我这样做:

[Authorize(Roles = "Domain\\MyADGroupToHaveAccess")]
Run Code Online (Sandbox Code Playgroud)

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

如何web.config使用AD授权?或者是否有另一种方法可以在ASP.NET Core中不对此设置进行硬编码?

Mor*_*834 18

我通过将其变成一个能够调用的策略来解决这个问题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));
});
Run Code Online (Sandbox Code Playgroud)

appsettings.json(或者appsettings.production.json如果你有不同):

"SecuritySettings": {
  "ADGroup": "YourDomain\\YourADGroup"
}
Run Code Online (Sandbox Code Playgroud)

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

[Authorize(Policy = "ADRoleOnly")]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助其他人

我还要弄清楚如何在全球范围内应用这个策略,所以我不必授权每个控制器,我想它可以用services.AddMvc某种方式完成?


sam*_*sam 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的其他控制器中:

public class LettersController : FTAControllerBase
{ ... }
Run Code Online (Sandbox Code Playgroud)

如果您想要对方法进行细化权限:

[Authorize("GenerateLetterAdUser")]
[HttpGet]
public IActionResult Generate()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

启动.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));
});
Run Code Online (Sandbox Code Playgroud)

应用程序设置.json:

"AuthorizedAdUsers": [
"domain\\groupname"
],
Run Code Online (Sandbox Code Playgroud)