Étendre la AuthorizeAttribute pour soutenir regex aime ceci:
class RegexAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
{
return base.AuthorizeCore(httpContext);
}
IPrincipal user = httpContext.User;
if (user == null || user.Identity == null || !user.Identity.IsAuthenticated)
{
return base.AuthorizeCore(httpContext);
}
if (!string.IsNullOrEmpty(Users) && Regex.IsMatch(user.Identity.Name, Users))
{
return true;
}
if (!string.IsNullOrEmpty(Roles))
{
var rolesManager = new RoleStore<IdentityRole>(httpContext.GetOwinContext().Get<ApplicationDbContext>());
var matchedRoles = rolesManager.Roles.Select(t => t.Name).AsEnumerable().Where(t => Regex.IsMatch(t, Roles));
if (matchedRoles.Any(user.IsInRole))
{
return true;
}
}
return base.AuthorizeCore(httpContext);
}
}
Plus tard, vous pouvez organiser vos rôles en groupes pour être en mesure de faire correspondre un tas d'entre eux en utilisant des expressions régulières comme ceci:
[RegexAuthorize(Roles = @"Role #\d")]
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
Cela correspondra à tous les rôles suivants: Rôle # 0, # 1 Rôle, ..., Rôle # 9
Espoir cette aide!
Que voulez-vous dire «rôle dynamique»? – Hadee
Essayez d'établir une convention et d'utiliser une expression régulière dans l'attribut Authorize. Je l'ai fait dans le passé, je ne sais pas si elle est soutenue en ce moment. – Miguel