Domanda

Sto seguendo questo Tutorial ASP.NET MVC da Microsoft:

Il mio codice è leggermente diverso, dove sto cercando di accedere HttpContext.Request.IsAuthenticated Nel costruttore del controller.

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

Il problema è che HttpContext è sempre nullo.

c'è una soluzione a questo?

È stato utile?

Soluzione

Il controller è istanziato in modo significativo prima del punto in cui viene invocata l'azione indice e al momento della costruzione HTTPContext non è effettivamente disponibile. Cosa c'è di sbagliato nel fare riferimento nel metodo del controller Index?

Altri suggerimenti

Invece di mettere il tuo HttpContext.Request.IsAuthenticated A livello di controller dovresti inserirlo in classe di base del controller che verrà ereditato in tutto il controller con un metodo di override di metodo OnaCactionExecuting ().

Nella base del controller dovresti avere

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

E tutto il tuo controller dovrebbe ereditare la classe BaseController

public class ApplicationController : BaseController

ora dovresti ottenere il ViewData["IsAuthenticated"] Nella tua pagina principale.

Modificare

Con il link che hai dato e relativo a ciò che hai fatto, il tuo ApplicationController è un controller di pagina, non un controller di base. Nell'esempio, ApplicationController è un controller di base ereditato dal HomeController Ma quello che hai fatto è che stai posizionando il metodo di azione all'interno del controller di base che è il ApplicationController Pertanto il metodo dell'indice di azione non verrà invocato quando si chiama una pagina (pagina indice) che non proviene da ApplicationController.

Ti suggerirei di usare:

 System.Web.HttpContext.Current.Request

Ricorda System.Web.HttpContext.Current è threadstatic, ma se non si utilizza thread aggiuntivo, la soluzione funziona.

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;
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top