Вопрос

Я следую по этому поводу Учебник MVC ASP.NET от Microsoft:

Мой код немного отличается, где я пытаюсь получить доступ HttpContext.Request.IsAuthenticated в конструкторе контроллера.

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

Проблема в том, что HttpContext всегда нулевой.

Есть ли этому решение?

Это было полезно?

Решение

Контроллер существенно создается значительно до того, как вызывается действие индекса, и в момент строительства httpcontext действительно недоступен. Что не так с ссылкой на его методе контроллера Index?

Другие советы

вместо того, чтобы положить свой HttpContext.Request.IsAuthenticated В уровне контроллера вы должны поместить его в базовый класс контроллера, который будет унаследован во всем вашим контроллере с методом переопределения метода ONACTIEXECUTING ().

В базе контроллера вы должны иметь

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 но то, что вы сделали, вы указываете метод действий внутри вашего базового контроллера, который является ApplicationController Таким образом, ваш метод индекса действий не будет вызван при вызове любой страницы (Page index), которая не от ApplicationController.

Я бы предложил вам использовать:

 System.Web.HttpContext.Current.Request

Просто помни System.Web.HttpContext.Current Это ThreadStatic, но если вы не используете дополнительную нить, решение работает.

Решение этой проблемы состоит в том, чтобы создать метод переопределения инициализации путем прохождения объекта 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;
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top