Error hiding menu based on user permissions

0

Hello, I had a method to control access to menus, based on permissions. But nothing has stopped working and I get the error: "Can not bind at runtime to a null reference"

I do not know what's been changed for this to happen.

Here is the code where I make the comparison:

In my model I have an ENUM, with possible profiles:

public enum Perfil
{
    /// <summary>
    /// Permissão para Envio, Listagem e Visualização dos arquivos.
    /// </summary>
    FUNCIONARIO,

    /// <summary>
    /// Permissão para Envio, Listagem, Visualização, Análise e Sincronização dos arquivos.
    /// </summary>
    SERVIDOR,

    /// <summary>
    /// Todas as permissões, inclusive inclusão de novos usuários para acesso ao sistema.
    /// </summary>
    ADMINISTRADOR
}

And in the model I have an attribute with the profile of each user:

 [Display(Name = "Perfil")]
    public string sPerfil { get; set; }

In my authentication class, I have the following code, to see whether or not the user is allowed:

public class CustomAutenticacaoAttribute : AuthorizeAttribute
{
    [Inject]
    public IAutenticacaoProvider autenticacaoProvider { get; set; }

    private string msgErro;

    private string[] perfilComPermissao;

    public CustomAutenticacaoAttribute(Perfil[] perfil)
    {
        perfilComPermissao = new string[perfil.Length];

        for (int x = 0; x < perfil.Length; x++)
        {
            perfilComPermissao.SetValue(perfil[x].ToString(), x);
        }
    }


    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (!autenticacaoProvider.Autenticado)
        {
            msgErro = "Você precisa estar autenticado para acessar essa página";
            return false;
        }
        if (perfilComPermissao.Length > 0 && !perfilComPermissao.Contains<string>(autenticacaoProvider.UsuarioAutenticado.Perfil))
        {
            msgErro = "Você não tem permissão para acessar essa página com suas credenciais.";
            return false;
        }
        return true;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
        filterContext.Controller.TempData["Mensagem"] = msgErro;


    }
}

}

And in the view I just make the following marking:

 @if (ViewBag.UsuarioAutenticado.Perfil.Equals(PortalRH.DomainModel.Entities.Perfil.FUNCIONARIO.ToString())
                             || (ViewBag.UsuarioAutenticado.Perfil.Equals(PortalRH.DomainModel.Entities.Perfil.ADMINISTRADOR.ToString())))
                        {
                            <li>@Html.ActionLink("Todos", "Index", "Requerimento")</li>
                        }

It was working perfectly, but I made some changes to the code in my controllers, and I do not know what could have caused it. Would anyone know how to help me?

    
asked by anonymous 12.01.2015 / 13:42

1 answer

1

I've switched View authentication from:

 @if (ViewBag.UsuarioAutenticado.Perfil.Equals(PortalRH.DomainModel.Entities.Perfil.FUNCIONARIO.ToString())
                         || (ViewBag.UsuarioAutenticado.Perfil.Equals(PortalRH.DomainModel.Entities.Perfil.ADMINISTRADOR.ToString())))
                    {

By:

 @if (ViewBag.Perfil == "ADMINISTRADOR" || ViewBag.Perfil == "FUNCIONARIO")
                        {
                            <li>@Html.ActionLink("Todos", "Index", "Requerimento")</li>
                        }

And it worked correctly. I do not know if this is the best way, or if it's the right way, but it's working.

    
12.01.2015 / 19:41