Pergunta

Estou seguindo isso ASP.NET MVC Tutorial da Microsoft:

Meu código é um pouco diferente, onde estou tentando acessar HttpContext.Request.IsAuthenticated no construtor do controlador.

namespace SCE.Controllers.Application
{
    public abstract class ApplicationController : Controller
    {
        public ApplicationController()
        {
            bool usuario = HttpContext.Request.IsAuthenticated;
        }           
    }
}

O problema é que HttpContext é sempre nulo.

Existe uma solução para isso?

Foi útil?

Solução

O controlador é instanciado significativamente antes do ponto em que a ação do índice é invocada e, no momento da construção, o HttpContext está realmente indisponível. O que há de errado em referenciá -lo no seu método do controlador Index?

Outras dicas

Em vez de colocar o seu HttpContext.Request.IsAuthenticated No nível do controlador, você deve colocá -lo na classe base do controlador que será herdada em todo o seu controlador com um método de substituição do método onactionExecuting ().

Na sua base de controladores, você deve ter

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext ctx) {
        base.OnActionExecuting(ctx);
        ViewData["IsAuthenticated"] = HttpContext.Request.IsAuthenticated;
    }
}

E todo o seu controlador deve herdar a classe do controlador de base

public class ApplicationController : BaseController

Agora você deve pegar o ViewData["IsAuthenticated"] em sua página mestre.

Editar

Com o link que você deu e relacionado ao que você fez, seu ApplicationController é um controlador de página, não um controlador base. No exemplo, ApplicationController é um controlador base herdado pelo HomeController Mas o que você fez é que está colocando o método de ação dentro do seu controlador base, que é o ApplicationController Portanto, seu método de índice de ação não será chamado quando você ligar para qualquer página (página de índice) que não seja do ApplicationController.

Eu sugeriria que você use:

 System.Web.HttpContext.Current.Request

Apenas lembra-te System.Web.HttpContext.Current é threadstatic, mas se você não usar thread adicional, a solução funciona.

A solução desse problema é criar um método de substituição de inicialização ao aprovar o objeto RequestContext.

public class ChartsController : Controller
{
     bool isAuthed = false;
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);

        if (requestContext.HttpContext.User.Identity.IsAuthenticated)
        {
          isAuthed =true;
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top