web-dev-qa-db-fra.com

ASP.NET Core Autoriser les groupes AD via web.config

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?

5
Morten_564834

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?

15
Morten_564834

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"
],
0
sam