使用Authorize属性清除会话?

时间:2011-09-29 08:24:24

标签: c# asp.net asp.net-mvc asp.net-mvc-3

我正在尝试自定义我的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 个答案:

答案 0 :(得分:1)

表单授权和会话是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);
            }
        }
    }
}