[英]ASP.NET Core Authorize AD Groups through web.config
在我旧的 .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 中硬编码此设置?
我通过将其变成一个能够调用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
以某种方式完成?
为了扩展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"
],
我能够使用以下内容重现 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"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.