Сессия очищается с атрибутом Authorize? - PullRequest
2 голосов
/ 29 сентября 2011

Я пытаюсь настроить свой атрибут Authorize, чтобы он перенаправлял пользователя на соответствующую страницу, если он не авторизован.

Это мой код до сих пор:

 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;

        }
    }

Проблема в том,все, что я храню в Session или TempData в этом методе, теряется, когда пользователь прибывает в какой-либо метод действия в контроллере после того, как перенаправление выполнено из этого метода.Я проверил Session.Keys / TempData.Keys и т. Д. Но все значения потеряны.Возможно, что-то происходит в base.HandleUnauthorizedRequest(filterContext);.Но я думаю, что вызов на базу важен.

Кто-нибудь может сказать мне точную причину этого поведения и как я могу предотвратить это?

1 Ответ

1 голос
/ 29 сентября 2011

Форма авторизации и сеанс - это разные понятия для IIS. Вы можете авторизоваться, но ваш сеанс может быть недопустимым (например, попытайтесь перезапустить пул приложений).

Попробуйте использовать этот пользовательский атрибут:

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);
            }
        }
    }
}            
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...