我有一个针对属于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"));
}
}
}
答案 0 :(得分:0)
AFAIK,Request.UrlReferrer是不可靠的方法,因为许多代理/防火墙服务器剥离了它 来自安全问题请求的字段。
如果您的要求只是检查请求是否来自其他应用,并且您可以访问“https://validreferrer”应用并且可以修改源,那么可能的解决方案是:您可以尝试附加查询字符串变量到另一个应用程序的url链接,然后在当前应用程序中捕获querystring变量以区分引用者。 Related thread仅供参考。