Dans mon ancienne application .NET MVC, je pouvais activer l'authentification Windows dans IIS et désactiver l'anonymat. Ensuite, dans mon fichier web.config
il me suffisait de mettre ceci:
<authorization>
<allow roles="Domain\MyADGroupToHaveAccess" />
<deny users="*" />
</authorization>
Dans .NET Core 2.0, cela ne fonctionnera pas - cela nie correctement l'anonymat, mais il autorise tous les utilisateurs, quoi qu'il arrive.
Si je fais ça:
[Authorize(Roles = "Domain\\MyADGroupToHaveAccess")]
sur ma HomeController
, cela fonctionne, mais je ne souhaite pas coder en dur ce paramètre dans mon projet car il doit être modifié pour d'autres environnements.
Comment puis-je faire en sorte que web.config
fonctionne avec une autorisation AD? Ou existe-t-il un autre moyen de ne pas coder en dur ce paramètre dans ASP.NET Core?
J'ai résolu ce problème en en faisant une stratégie capable d'appeler appsettings.json
. De cette manière, les autres personnes ayant accès au serveur peuvent ensuite éditer le groupe.
Dans 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));
});
Dans appsettings.json
(ou peut-être appsettings.production.json
si vous avez différent):
"SecuritySettings": {
"ADGroup": "YourDomain\\YourADGroup"
}
Dans vos contrôleurs, vous pouvez ensuite le décorer avec cet attribut:
[Authorize(Policy = "ADRoleOnly")]
J'espère que cela peut aider d'autres personnes
Il me reste à comprendre comment appliquer cette politique de manière globale, de sorte que je n'ai pas à autoriser tous les contrôleurs. Je suppose que cela peut être fait dans le services.AddMvc
d'une manière ou d'une autre?
Pour développer la réponse de Morten_564834, voici notre approche de ce problème. Créez un contrôleur de base dont tous les contrôleurs héritent.
[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();
}
}
Puis dans vos autres contrôleurs:
public class LettersController : FTAControllerBase
{ ... }
Si vous voulez des autorisations granulaires sur les méthodes:
[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"
],