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 ?
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);
. . . .
}
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
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.