Je suis ceci tutoriel ASP.NET MVC de Microsoft :
Mon code est légèrement différent, où j'essaie d'accéder à HttpContext.Request.IsAuthenticated
dans le constructeur du contrôleur.
namespace SCE.Controllers.Application
{
public abstract class ApplicationController : Controller
{
public ApplicationController()
{
bool usuario = HttpContext.Request.IsAuthenticated;
}
}
}
Le problème est que HttpContext
est toujours nul.
Y a-t-il une solution à cela?
Le contrôleur est instancié de manière significative avant le point où l'action Index est invoquée, et au moment de la construction, HttpContext n'est en effet pas disponible. Quel est le problème avec le référencer dans votre méthode de contrôleur Index
?
au lieu de mettre votre HttpContext.Request.IsAuthenticated
au niveau Controller, vous devez le placer dans la classe Controller Base qui sera héritée dans tout votre contrôleur avec une méthode de remplacement de la méthode OnActionExecuting ().
Dans votre base de contrôleur, vous devriez avoir
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext ctx) {
base.OnActionExecuting(ctx);
ViewData["IsAuthenticated"] = HttpContext.Request.IsAuthenticated;
}
}
et tout votre contrôleur devrait hériter de la classe BaseController
public class ApplicationController : BaseController
vous devriez maintenant obtenir le ViewData["IsAuthenticated"]
dans votre page maître.
Avec le lien que vous avez donné et relatif à ce que vous avez fait, votre ApplicationController
est un contrôleur de page, pas un contrôleur de base. Dans l'exemple, ApplicationController
est un contrôleur de base hérité par le HomeController
mais ce que vous avez fait, c'est que vous placez la méthode Action dans votre contrôleur de base, qui est le ApplicationController
votre méthode Action Index ne sera donc pas invoquée lorsque vous appelez une page (page Index) qui ne provient pas d'ApplicationController.
Je vous suggère d'utiliser:
System.Web.HttpContext.Current.Request
Rappelez-vous juste System.Web.HttpContext.Current
est threadstatic, mais si vous n'utilisez pas de thread supplémentaire, la solution fonctionne.
La solution de ce problème consiste à créer une méthode de remplacement de Initialize en passant l'objet 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;
}
}
}