2 votes

La session est effacée avec l'attribut Authorize ?

J'essaie de personnaliser mon attribut Authorize pour qu'il redirige l'utilisateur vers la page appropriée s'il n'est pas autorisé.

C'est mon code jusqu'à présent :

 public class CustomAuthorizationAttribute : AuthorizeAttribute
    {
        public string ErrorMessage { get; set; }

        public string WebConfigKey { get; set; }

        private const string UnauthorizedAccessMessage = "UnauthorizedAccessMessage";

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            HttpContext.Current.Session["foo"] = "bar";

            base.HandleUnauthorizedRequest(filterContext);

            if (string.IsNullOrEmpty(WebConfigKey))
                throw new ArgumentNullException("WebConfigKey parameter is missing. WebConfigKey should give the actual page/url");

            string configValue = ConfigurationManager.AppSettings[WebConfigKey];

            if (string.IsNullOrEmpty(configValue))
                throw new Exception(WebConfigKey + "'s value is null or empty");

            if (!configValue.StartsWith("http"))
                HttpContext.Current.Response.Redirect(WebUIUtils.GetSiteUrl() + configValue);
            else
                HttpContext.Current.Response.Redirect(configValue);

            filterContext.Controller.TempData[UnauthorizedAccessMessage] = ErrorMessage;

            HttpContext.Current.Session[UnauthorizedAccessMessage] = ErrorMessage;

        }
    }

Le problème est que tout ce que je stocke dans Session ou TempData dans cette méthode est perdu lorsque l'utilisateur arrive dans une méthode d'action dans le contrôleur après que la redirection a été faite à partir de cette méthode. J'ai vérifié Session.Keys/TempData.Keys etc. Mais toutes les valeurs sont perdues. Il se passe probablement quelque chose dans base.HandleUnauthorizedRequest(filterContext); . Mais je suppose que l'appel à la base est important.

Quelqu'un peut-il me dire la raison exacte de ce comportement et comment l'empêcher de se produire ?

1voto

Max Zerbini Points 1731

L'autorisation de formulaire et la session sont des concepts distincts pour IIS. Vous pouvez être autorisé mais votre session peut ne pas être valide (par exemple essayer de redémarrer le pool d'applications).

Essayez avec cet attribut personnalisé :

public class CustomAuthorizationAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        if (filterContext.Result == null)
        {

            if (filterContext.HttpContext.Session != null )
            {
                //add checks for your configuration
                //add session data

                // if you have a url you can use RedirectResult
                // in this example I use RedirectToRouteResult

                RouteValueDictionary rd = new RouteValueDictionary();
                rd.Add("controller", "Account");
                rd.Add("action", "LogOn");
                filterContext.Result = new RedirectToRouteResult("Default", rd);
            }
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X