web-dev-qa-db-fra.com

Implémentation de l'autorisation basée sur les rôles à l'aide de .NET MVC 5

Je souhaite implémenter une autorisation basée sur les rôles dans l'application Web que je suis en train de créer. La façon dont j'ai imaginé de faire cela est de créer 3 tables dans ma base de données comme suit:

1. Roles
2. UserRoles (many to many table)
3. Users 

Après cela, chaque utilisateur se verra attribuer un rôle. Maintenant ... Ma question est la suivante: comment autoriser ou interdire l'accès à des vues/contrôleurs spécifiques dans mon application .NET MVC. Je suis tombé sur ceci:

[Authorize(Roles = "HrAdmin, CanEnterPayroll")]
[HttpPost]
public ActionResult EnterPayroll(string id)
{
    //  . . . Enter some payroll . . . 
}

La propriété Authorize semble limiter les actions/contrôleurs spécifiques à des rôles spécifiques ... Mais que se passe-t-il si je lis les rôles de l'utilisateur à partir de la table UserRoles, comme dans mon cas ?? Comment mon application va-t-elle savoir quel rôle l'utilisateur a sur le système?

Est-ce que quelqu'un peut m'aider avec ça ?

7
User987

Supposons que vous avez stocké votre nom d'utilisateur et vos rôles dans la session:

[AllowAnonymous]
[HttpGet]
public ActionResult Login()
{
    . . . .

    string userName = (string)Session["UserName"];
    string[] userRoles = (string[])Session["UserRoles"];

    ClaimsIdentity identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie);

    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userName));

    userRoles.ToList().ForEach((role) => identity.AddClaim(new Claim(ClaimTypes.Role, role)));

    identity.AddClaim(new Claim(ClaimTypes.Name, userName));

    AuthenticationManager.SignIn(identity);

    . . . .
}
7
SeM

si vous autorisez un rôle à accéder à un contrôleur (au niveau de la classe) ou à une action (au niveau de la fonction), ces rôles auront accès. sinon l'accès est refusé.

si vous utilisez uniquement le mot clé Authorize sans spécifier les rôles ou les utilisateurs, tous les utilisateurs authentifiés auront accès.

espère pleinement que je le fais clair? 

utiliser l'identité basée sur les revendications se référer à la suivante 

https://msdn.Microsoft.com/en-gb/library/ee517291.aspx

https://msdn.Microsoft.com/en-gb/library/ff359101.aspx

c'est sur Core 

Quelles sont les revendications dans ASP .NET Identity

1
Emil

Voici quelques éléments de code permettant d’atteindre cet objectif à l’aide d’Azure Active Directory. Configuration de l'application dans Startup.cs:

public void ConfigureApplication(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ...

    app.UseIISPlatformHandler();
    app.UseStaticFiles();

    app.UseCookieAuthentication(options =>
    {
        options.AutomaticAuthenticate = true;
    });            

    app.UseOpenIdConnectAuthentication(options =>
    {
        options.AutomaticChallenge = true;
        options.ClientId = Configuration.Get<string>("Authentication:AzureAd:ClientId");
        options.Authority = Configuration.Get<string>("Authentication:AzureAd:AADInstance") + "Common";
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = false,
            RoleClaimType = "roles"
        };
        options.Events = new OpenIdConnectEvents
        {
            OnAuthenticationValidated = (context) => Task.FromResult(0),
            OnAuthenticationFailed = (context) =>
            {
               context.Response.Redirect("/Home/Error");
               context.HandleResponse(); // Suppress the exception
               return Task.FromResult(0);
            },
            OnRemoteError = (context) => Task.FromResult(0)
        };
    });

    app.UseMvc(routes =>
    {
       routes.MapRoute(name: "default", template: "{controller=Dashboard}/{action=Index}/{id?}");                
    });

    DatabaseInitializer.InitializaDatabaseAsync(app.ApplicationServices).Wait();
}

Et voici l'usage:

[Authorize(Roles = "SuperAdmin, Worker")]
public ActionResult Index()
{
    ViewBag.Message = "Hello";
    return View();
}

et: 

public ActionResult Submit(FormCollection formCollection)
{
    if (User.IsInRole("SuperAdmin") || User.IsInRole("Worker"))
    {
        ...
    }

    if (User.IsInRole("Admin"))
    { 
        //do some admin tasks
    }

    return RedirectToAction("Index", "Tasks");
}

Voici mon article de blog sur ce sujet: http://www.eidias.com/blog/2016/1/16/using-Azure-active-directory-application-roles . Vous pouvez trouver ici comment configurer les rôles ci-dessus dans AAD.

0
Dawid Rutkowski