62

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?

4

5 回答 5

113

而不是把你HttpContext.Request.IsAuthenticated放在控制器级别,你应该把它放在控制器基类中,它将在你的所有控制器中继承,并使用 OnActionExecuting() 方法的覆盖方法。

在您的控制器基础中,您应该拥有

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

并且您的所有控制器都应该继承 BaseController 类

public class ApplicationController : BaseController

现在您应该ViewData["IsAuthenticated"]在您的母版页中获得。

编辑

通过您提供的链接,并与您所做的相关,您ApplicationController是页面控制器,而不是基本控制器。在示例中,ApplicationController是一个由 继承的基本控制器,HomeController但您所做的是将 Action 方法放在基本控制器中,ApplicationController这样当您调用任何页面(索引页面)时,您的 Action Index 方法将不会被调用那不是来自ApplicationController。

于 2010-08-08T01:21:53.840 回答
59

我建议你使用:

 System.Web.HttpContext.Current.Request

请记住System.Web.HttpContext.Current是 threadstatic,但如果您不使用其他线程,则该解决方案有效。

于 2013-07-09T10:15:25.903 回答
12

Controller 在调用 Index 操作之前显着实例化,并且在构造时 HttpContext 确实不可用。在控制器方法中引用它有什么问题Index

于 2010-08-08T01:22:16.340 回答
11

这个问题的解决方法是通过传递RequestContext对象创建一个Initialize的override方法。

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;
        }
    }
}
于 2016-02-29T17:56:35.403 回答
2

在此处输入图像描述通过我在此处发布的答案,您无法访问 IsAuthenticated,但您可以访问与 HttpContextRequest 相关的一些内容(参见图片),

我需要构造函数中的会话值。

您可以使用 IHttpContextAccessor 如下:

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

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

在startup.cs中,你需要配置,

services.AddHttpContextAccessor();
于 2021-10-15T11:12:54.210 回答