web-dev-qa-db-fra.com

Ajouter dynamiquement des rôles pour autoriser l'attribut du contrôleur

Je dois permettre à mon utilisateur administrateur de modifier les autorisations d'accès pour les utilisateurs à la volée, afin qu'ils puissent créer de nouveaux rôles et ajouter des autorisations à ces rôles.

Je veux pouvoir créer un attribut Authorize à coller au-dessus de ma classe de contrôleur auquel je peux ajouter des rôles à partir d'une base de données, afin de ne pas avoir à "définir" les rôles pendant le développement, comme dans [Authorize(Roles="Role1, Role2")] etc.

Donc, quelque chose comme [Authorize(Roles = GetListOfRoles()]

J'ai trouvé cette question - ASP.NET MVC Authorize user with many roles qui fait quelque chose de similaire mais peut-être qu'il existe un moyen de changer cela de telle sorte qu'il obtienne une liste des autorisations/rôles de la base de données?

21
barnacle.m

C'est ainsi que j'ai retiré un attribut qui pourrait autoriser les utilisateurs par méthode en fonction des autorisations du rôle de cet utilisateur. J'espère que cela aide quelqu'un d'autre:

/// <summary>
/// Custom authorization attribute for setting per-method accessibility 
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class SetPermissionsAttribute : AuthorizeAttribute
{
    /// <summary>
    /// The name of each action that must be permissible for this method, separated by a comma.
    /// </summary>
    public string Permissions { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        SalesDBContext db = new SalesDBContext();
        UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
        ApplicationDbContext dbu = new ApplicationDbContext();

        bool isUserAuthorized = base.AuthorizeCore(httpContext);

        string[] permissions = Permissions.Split(',').ToArray();

        IEnumerable<string> perms = permissions.Intersect(db.Permissions.Select(p => p.ActionName));
        List<IdentityRole> roles = new List<IdentityRole>();

        if (perms.Count() > 0)
        {
            foreach (var item in perms)
            {
                var currentUserId = httpContext.User.Identity.GetUserId();
                var relatedPermisssionRole = dbu.Roles.Find(db.Permissions.Single(p => p.ActionName == item).RoleId).Name;
                if (userManager.IsInRole(currentUserId, relatedPermisssionRole))
                {
                    return true;
                }
            }
        }
        return false;
    }
}
17
barnacle.m

Et quelque chose comme ça:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MyCustomAuthorizationAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // Do some logic here to pull authorised roles from backing store (AppSettings, MSSQL, MySQL, MongoDB etc)
        ...
        // Check that the user belongs to one or more of these roles 
        bool isUserAuthorized = ....;

        if(isUserAuthorized) 
            return true;

        return base.AuthorizeCore(httpContext);
    }
}

Vous pouvez l'utiliser avec une base de données ou simplement conserver une liste des rôles autorisés dans le web.config.

9
Mick Walker