无法禁用ASP.NET cookieless模式

时间:2017-11-18 20:40:07

标签: asp.net .net

我试图找出UrlHelper.RouteUrl为什么会返回以/(F(开头的无Cookie网址的原因。这似乎只适用于Bing请求(Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm))。

我已经禁用过3次无Cookie模式:

<authentication mode="None">
  <forms cookieless="UseCookies" />
</authentication>

<anonymousIdentification enabled="true" cookieless="UseCookies" />

<sessionState cookieless="UseCookies" />

我还添加了以下断言:

if (url.StartsWith("/(F(", StringComparison.Ordinal))
    throw new Exception(
        FormsAuthentication.CookieMode + " " +
        FormsAuthentication.CookiesSupported + " " +
        HttpContext.Current.Request.Browser.Cookies);

这引发了bing bot的情况。但它声称CookieMode == UseCookies && CookiesSupported == true && Browser.Cookies == true。这意味着配置设置,以及ASP.NET认为Bing bot 支持cookie。没有任何理由将此无cookie的字符串添加到URL。

我无法在Windows 7 .NET 4.7上本地重现它。生产服务器运行带有.NET 4.7的Server 2008 R2。

我努力禁用这个令人讨厌的功能。我怎么能摆脱这种疯狂呢?

更新:F似乎意味着表单身份验证功能负责。但很明显它在web.config中被禁用了?!据我所知,我没有以任何方式使用它(可能是一个错误的假设)。

另外,我测试了&#34; app路径修改器&#34; MVC正在使用的值:

var x =
(string)typeof(HttpResponse)
.GetField("_appPathModifier", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy)
.GetValue(HttpContext.Current.Response);

我将此值添加到断言中,确实存在令人讨厌的/(F(字符串。我不知道.NET Framework是如何设置这个值的。

enter image description here

1 个答案:

答案 0 :(得分:0)

因为在此之前,已经从网址路径中删除了SessionId的值(CookielessHelper.RemoveCookielessValuesFromPath)。

HttpContext的Init方法对此进行处理。

private void Init(HttpRequest request, HttpResponse response)
{
    this._request = request;
    this._response = response;
    this._utcTimestamp = DateTime.UtcNow;
    this._principalContainer = this;
    if (this._wr is IIS7WorkerRequest)
    {
        this._isIntegratedPipeline = true;
    }
    if (!(this._wr is StateHttpWorkerRequest))
    {
        this.CookielessHelper.RemoveCookielessValuesFromPath();
    }
    // other codes ...
}

请参考Possible Bug With ASP.NET MVC 3 Routing?

我将在Application_BeginRequest事件中检查Response._appPathModifier值,

protected void Application_BeginRequest(object sender, EventArgs e)
{
    //到這時,Url已被改成沒包含SessionId
    //但它的值會放在 Response._appPathModifier 變數之中
    var appPathModifierFieldInfo = Context.Response.GetType().GetField("_appPathModifier",
                 BindingFlags.NonPublic | BindingFlags.Instance);
    var appPathModifier = appPathModifierFieldInfo.GetValue(Context.Response);
    if (appPathModifier != null)
    {
        //url 中有 SessionId
        throw new HttpException(404, "Not found");
    }
}