Permitir que múltiples roles accedan a la acción del controlador

Resuelto codette asked hace 15 años • 0 respuestas

Ahora mismo decoro un método como este para permitir que los "miembros" accedan a la acción de mi controlador

[Authorize(Roles="members")]

¿Cómo permito más de un rol? Por ejemplo, lo siguiente no funciona pero muestra lo que estoy intentando hacer (permitir acceso a "miembros" y "administradores"):

[Authorize(Roles="members", "admin")] 
codette avatar Mar 31 '09 12:03 codette
Aceptado

Otra opción es utilizar un único filtro de autorización tal como publicó, pero eliminar las comillas internas.

[Authorize(Roles="members,admin")]
Jim Schmehil avatar Oct 01 '2009 13:10 Jim Schmehil

Si desea utilizar roles personalizados, puede hacer esto:

CustomRolesclase:

public static class CustomRoles
{
    public const string Administrator = "Administrador";
    public const string User = "Usuario";
}

Uso

[Authorize(Roles = CustomRoles.Administrator +","+ CustomRoles.User)]

Si tiene pocos roles, tal vez pueda combinarlos (para mayor claridad) de esta manera:

public static class CustomRoles
{
     public const string Administrator = "Administrador";
     public const string User = "Usuario";
     public const string AdministratorOrUser = Administrator + "," + User;  
}

Uso

[Authorize(Roles = CustomRoles.AdministratorOrUser)]
Pablo Claus avatar May 23 '2012 15:05 Pablo Claus

Una posible simplificación sería subclasificar AuthorizeAttribute:

public class RolesAttribute : AuthorizeAttribute
{
    public RolesAttribute(params string[] roles)
    {
        Roles = String.Join(",", roles);
    }
}

Uso:

[Roles("members", "admin")]

Semánticamente es lo mismo que la respuesta de Jim Schmehil.

Mihkel Müür avatar Mar 25 '2014 18:03 Mihkel Müür

Para MVC4, usando un Enum( UserRoles) con mis roles, uso un archivo personalizado AuthorizeAttribute.

En mi acción controlada, hago:

[CustomAuthorize(UserRoles.Admin, UserRoles.User)]
public ActionResult ChangePassword()
{
    return View();
}

Y uso una costumbre AuthorizeAttributecomo esa:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class CustomAuthorize : AuthorizeAttribute
{
    private string[] UserProfilesRequired { get; set; }

    public CustomAuthorize(params object[] userProfilesRequired)
    {
        if (userProfilesRequired.Any(p => p.GetType().BaseType != typeof(Enum)))
            throw new ArgumentException("userProfilesRequired");

        this.UserProfilesRequired = userProfilesRequired.Select(p => Enum.GetName(p.GetType(), p)).ToArray();
    }

    public override void OnAuthorization(AuthorizationContext context)
    {
        bool authorized = false;

        foreach (var role in this.UserProfilesRequired)
            if (HttpContext.Current.User.IsInRole(role))
            {
                authorized = true;
                break;
            }

        if (!authorized)
        {
            var url = new UrlHelper(context.RequestContext);
            var logonUrl = url.Action("Http", "Error", new { Id = 401, Area = "" });
            context.Result = new RedirectResult(logonUrl);

            return;
        }
    }
}

Esto es parte del FNHMVC modificado por Fabricio Martínez Tamayo https://github.com/fabriciomrtnz/FNHMVC/

Bernardo Loureiro avatar Feb 19 '2014 20:02 Bernardo Loureiro