在AuthorizeCore

时间:2016-07-22 19:52:06

标签: c# asp.net-mvc-3 cookies session-variables custom-authentication

我正在努力让测试环境站起来(目前称为DEV)并且遇到了一些奇怪的问题。

当您第一次来到网站时,我们有一个协议页面。点击“我同意”按钮将强制用户通过操作来检查他们是否已经是该网站的成员。我们也使用演示模式,但这不是问题的一部分。

我目前遇到的问题如下。最初在Action中,我们创建了一个名为“siteaccept”的Cookie。一旦创建,我们确定该站点是否处于演示模式,然后继续获取用户(实际用户或演示用户)。一旦找到用户,我们将他们的ID记录在名为“cntPOC”的Cookie中,并使用相同的数据创建一个具有相同数据的Session变量(原始开发人员写了很多这个错综复杂的逻辑,我想在有人问为什么之前改变它保持会话和Cookie)。然后,我们对Action执行RedirectToAction以显示站点的主页面。

这是问题发挥作用的地方。网站的Action的主页面上有一个CustomAuthorizeAttribute装饰。在我们的CustomAuthorizeAttribute类中,我们将OnAuthorizion和AuthorizeCore覆盖。 OnAuthorizion首先发射,然而,它使用base.OnAuthorization。一旦调用,就会调用AuthorizeCore。在AuthorizeCore中,我们检查“siteaccept”Cookie,然后检查“cntPOC”会话变量。如果两者都存在,则返回true,否则返回false。

不仅在我的本地环境而且在DBA上,这都可以顺利运行。我看到了Cookie和Session变量。但是,在我们的DEV环境中,缺少Cookie和Session变量。我们已经将IE 11配置为允许使用Cookie,但是一旦我们离开Action并进入CustomAuthorizeAttribute,我们就无法获取它们。

如果我检查HttpContext.Current.Response而不是HttpContext.Current.Request,我确实发现我今天可以找到Cookie,但这显然是不正确的方法。

以下是我的代码。我很确定,因为代码适用于我的本地环境,它在我们的DEV环境中应该没问题。另外请注意,我们的生产环境确实有效,因此代码显然起作用。现在问题是为什么DEV环境没有。

MainController.cs

    [HttpPost]
    public ActionResult Index(FormCollection frmCollection)
    {
        try
        {
            Response.Cookies.Remove("bracmisaccept");

            HttpCookie cookie = new HttpCookie("bracmisaccept");
            cookie.Value = "true";
            Response.Cookies.Add(cookie);

            ...

            //Demo Mode
            var poc = new HttpCookie("cntPOC");
            cookie.Value = "7578";
            Response.Cookies.Add(poc);

            Session["cntPOC"] = 7578;

            return RedirectToAction("ApplicationSelection");
        }
        catch (Exception ex)
        {
            logger.LogError("Main Index", ex);
            return PartialView(@"../Error/ExceptionHandling");
        }
   }

   [CustomAuthorizeAttribute]
   public ActionResult ApplicationSelection()
   {
        return View();
   }

CustomAuthorizeAttribute.cs

        public string RedirectUrl = "~/Main/SessionTimeout";
        public string CookieExpiredRedirectUrl = "~/Main/Index";
        public string AjaxRedirectUrl = "~/Error/AjaxError";
        private bool _isAuthorized;
        private bool _isCookieExpired;

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (HttpContext.Current.Request.Cookies["siteaccept"] == null)
            {
                _isAuthorized = false;
                _isCookieExpired = true;
                return false;
            }

            if (HttpContext.Current.Session["cntPOC"] == null)
            {
                _isAuthorized = false;
                return false;
            }

            return true;
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            if (!_isAuthorized)
            {
                if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.HttpContext.Response.StatusCode = 401;
                    filterContext.HttpContext.Response.End();
                }
                else
                {
                    if(_isCookieExpired)
                        filterContext.RequestContext.HttpContext.Response.Redirect(CookieExpiredRedirectUrl);
                    else
                        filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl);
                }
            }
        }

我相当确定代码很好,但我在一些文章中读过,AuthorizeCore有时可能会或可能没有Cookie和Session变量。我只是想知道我是否在浪费时间更改代码,或者是否是我们拥有此网站的方框。服务器是超级锁定的,所以是的,有点烦人......

编辑:我还没有弄清楚如何解决这个问题,但是,我确实发现如果我对这段代码进行发布,我可以正确地进入网站。我仍然无法运行localhost来检查该网站,但是发布修复了一些关于这个网站是否有效的小问题。

0 个答案:

没有答案