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

Posted

技术标签:

【中文标题】ASP.NET Core 通过 web.config 授权 AD 组【英文标题】:ASP.NET Core Authorize AD Groups through web.config 【发布时间】:2018-06-15 05:52:27 【问题描述】:

在我的旧 .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?),然后在属性 [Authorize(Role="MyADGroup")] 中引用相同的组/OU,然后是 AD 管理员或 OU 组代表可以添加/删除/修改组成员并有效地授予对我的控制器的访问权限,是吗?如果这不正确,那么我错过了什么?请参阅我的问题:***.com/questions/50498225/… 【参考方案1】:

我通过将其设置为能够调用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 提供的代码有什么问题?效果很好。 这是一篇关于如何默认将其应用于控制器的文章:joonasw.net/view/apply-authz-by-default 您将如何允许通过多个 AD 组中的任何一个(而不是一个)的成员身份进行访问?你会创建几个角色吗?还是几个政策?添加 AuthorizeFilters 时,它们是添加为or 还是and【参考方案2】:

为了扩展 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 中有另一个条目来保存相关的组名? GenerateLetterAdUser 将是 Active Directory 中的一个组,您可以将用户映射到 AD 组。因此 domainname\\generateletteraduser 将是用法。因此,您将要在 appsettings.json 中使用的所有组映射,在 AD 中将用户映射到组。这将使其同时使用 AD 和 .net 核心角色和策略。 非常感谢!!!!【参考方案3】:

我能够使用以下内容重现 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"

【讨论】:

以上是关于ASP.NET Core 通过 web.config 授权 AD 组的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 ASP.NET Core 中的链接发布

Asp.net core 通过grpc调用python

.NET 6学习笔记——ASP.NET Core通过配置文件启用HTTPS

通过代码创建新页面(Asp.Net Core)

Elmah 不适用于 asp.net mvc

ASP.NET Core JWT 令牌无法通过 HttpClient 工作