我目前正在努力建立一个测试环境(目前称为 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 的环境中,这都能顺利进行。我看到了我们的 Cookies 和 Session 变量。但是,在我们的 DEV 环境中,Cookies 和 Session 变量都丢失了。我们已将 IE 11 配置为允许 Cookie,但是一旦我们离开 Action 并继续进入 CustomAuthorizeAttribute,我们就无法获取它们。
我确实发现如果我检查 HttpContext.Current.Response 而不是 HttpContext.Current.Request,我今天可以找到 Cookie,但这显然是不正确的方法。
下面是我的代码。我相当肯定,因为代码适用于我的本地环境,它在我们的 DEV 环境中应该没问题。另请注意,我们的生产环境确实可以工作,因此代码显然可以正常工作。现在的问题是为什么 DEV 环境没有。
主控制器.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 有时可能有也可能没有 Cookies 和 Session 变量。我只是想知道我是否在浪费时间更改代码,或者它是否是我们拥有此网站的盒子。服务器被超级锁定,所以是的,有点烦人......
编辑:我还没有弄清楚如何解决这个问题,但是,我确实发现如果我对此代码进行发布,我可以正确进入该网站。我仍然无法运行 localhost 来检查该站点,但发布修复了一些关于该站点是否可以正常工作的小问题。