在Application_PostAuthenticateRequest中无法在AAD身份验证后获取正确的引荐来源

时间:2017-04-14 23:30:13

标签: asp.net-mvc-5 azure-active-directory

我有一个针对属于DL的某些用户进行重定向的方案。这是一个经过AAD认证的应用。 如果用户属于某个DL,则应加载该应用程序。另外,用户应该被重定向到另一个应用程序(" https://validreferrer")。他必须点击其他应用上的链接(" https://validreferrer")才能进入我的应用。 我将此检查放在post_authenticate事件中。我检查推荐人。如果这是有效的推荐人(" https://validreferrer"),请继续。如果不检查用户是否属于DL。如果用户不属于DL,则将用户重定向到" https://validreferrer",否则设置已验证的Cookie并继续访问该网站。

如果用户不属于DL - 第一次引用来自https://login.microsoftonline.com/72f98 ...因为请求是从AD验证的,因此引用者变为此,并且引荐来源检查失败。然后执行属于DL检查的用户并重定向用户。 但是,如果用户首先点击其他应用 - " https://validreferrer",然后点击该链接进入我的应用,则引荐来源仍为https://login.microsoftonline.com/72f98 ... " https://validreferrer"然后再次验证用户是否属于DL,然后重定向。现在再次,如果用户点击外部网站(" https://validreferrer")来到我的网站,则引荐来得正确。 如何避免这种双重定向。 我尝试在会话开始时捕获引荐来源,这是用户第一次来到正确的网站(" https://validreferrer"),但引荐来源(" https://validreferrer&# 34;)仅适用于Chrome。不是IE或Edge的情况。 是否有任何Request属性可用于区分这两个调用?或者还有其他方法可以解决这个问题吗?

示例代码 -

//这只是通过chrome捕获引用者。在IE和Edge中不起作用     protected void Session_Start(object sender,EventArgs e)

{
     if (Request.UrlReferrer != null &&

    HttpContext.Current.Request.Cookies["UrlReferrer"] == null)

    {
     HttpContext.Current.Response.Cookies.Add(new HttpCookie("UrlReferrer", Request.UrlReferrer.ToString()));
    }
   }

protected void Application_PostAuthenticateRequest(object sender,EventArgs e)         {

if (this.Request.IsAuthenticated && HttpContext.Current.Request.Cookies["Validated"] == null )
        {

            bool userinDL= true;

            //check if the referrer is correctly set do nothing
            //else check if this is a ring zero user. If not, redirect
            if ((Request.UrlReferrer == null || !Request.UrlReferrer.ToString().Contains("https://validreferrer")))
            {

                userinDL= CheckuserMembership();

                if (!userinDL)
                {

                    Response.Redirect("https://validreferrer");
                }
                else
                {
                    HttpContext.Current.Response.Cookies.Add(new HttpCookie("Validated", "true"));
                }
                 }
            }
            else
            {
                HttpContext.Current.Response.Cookies.Add(new HttpCookie("Validated", "true"));
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

AFAIK,Request.UrlReferrer是不可靠的方法,因为许多代理/防火墙服务器剥离了它 来自安全问题请求的字段。

如果您的要求只是检查请求是否来自其他应用,并且您可以访问“https://validreferrer”应用并且可以修改源,那么可能的解决方案是:您可以尝试附加查询字符串变量到另一个应用程序的url链接,然后在当前应用程序中捕获querystring变量以区分引用者。 Related thread仅供参考。