accessing HttpContext.Request in a controller's constructor

asp.net MvcHttpcontextControllers

asp.net Mvc Problem Overview


I'm following this ASP.NET MVC tutorial from Microsoft:

My code is slightly different, where I'm trying to access HttpContext.Request.IsAuthenticated in the controller's constructor.

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

The problem is that HttpContext is always null.

Is there a solution to this?

asp.net Mvc Solutions


Solution 1 - asp.net Mvc

instead of putting your HttpContext.Request.IsAuthenticated in Controller level you should put it in Controller Base class that will be inherited in all of your controller with an override method of OnActionExecuting() method.

In your Controller base you should have

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

and all your Controller should inherit the BaseController class

public class ApplicationController : BaseController

now you should get the ViewData["IsAuthenticated"] in your Master page.

Edit

With the link you have given, and relating to what you have done, your ApplicationController is a Page Controller, not a Base Controller. In the example, ApplicationController is a Base Controller that is inherited by the HomeController but what you have done is you are placing the Action method inside your base controller which is the ApplicationController so your Action Index method will not be invoked when you call any page (Index page) that is not from the ApplicationController.

Solution 2 - asp.net Mvc

I would suggest you use:

 System.Web.HttpContext.Current.Request

Just remember System.Web.HttpContext.Current is threadstatic, but if you don't use additional thread the solution works.

Solution 3 - asp.net Mvc

The Controller is instantiated significantly prior to the point where the Index action is invoked, and at the moment of construction HttpContext is indeed unavailable. What's wrong with referencing it in your controller method Index?

Solution 4 - asp.net Mvc

The solution of this problem is to create an override method of Initialize by passing RequestContext object.

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;
        }
    }
}

Solution 5 - asp.net Mvc

enter image description hereWith the answer I am posting here, you cannot access IsAuthenticated, but you can access some stuffs related to HttpContextRequest (see in image),

I needed session value in constructor.

You can use IHttpContextAccessor as below:

public ABCController(IHttpContextAccessor httpContextAccessor)   
{
     //do you stuff with httpContextAccessor,  

     // This gives session value
     string abc = httpContextAccessor.HttpContext.Session.GetString("Abc");
}

and in startup.cs, you need to configure,

services.AddHttpContextAccessor();

Solution 6 - asp.net Mvc

It is possible to get the HttpContext using IHttpContextAccessor injected into class constructor. Before doing so, you will need first to register the corresponding service to the service container in Startup.cs class or Program.cs such as below.

services.AddHttpContextAccessor(); // Startup.cs

builder.Services.AddHttpContextAccessor(); // Program.cs

Right after that, you can inject the IHttpContextAccessor interface in whererever method or class constructor.

 private bool isAuthenticated { get; set; }

    public ConstructorName(IHttpContextAccessor accessor)
    {
        var context = accessor.HttpContext;

        isAuthenticated = context.User.Identity.IsAuthenticated;
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionozsenegalView Question on Stackoverflow
Solution 1 - asp.net Mvcrob waminalView Answer on Stackoverflow
Solution 2 - asp.net MvcGhini AntonioView Answer on Stackoverflow
Solution 3 - asp.net MvcspenderView Answer on Stackoverflow
Solution 4 - asp.net MvcRicardo RodriguezView Answer on Stackoverflow
Solution 5 - asp.net MvcRohil PatelView Answer on Stackoverflow
Solution 6 - asp.net Mvcfaye.babacar78View Answer on Stackoverflow