Мы видим, что некоторые браузеры Safari не могут перекрестно аутентифицировать наш веб-сайт после того, как мы переходим на .NET 4.0 с .NET 3.5.
После долгих исследований выяснилось, что проблема связана с тем, что ASP.NET правильно идентифицирует браузеры Safari. ASP.NET идентифицирует некоторые Safari (возможно, другие браузеры на основе WebKit) в версии Mozilla версии 0.0. браузеры, которые не поддерживают файлы cookie, фреймы, JavaScript и т.д. У .NET 3.5 нет проблем с идентификацией этих браузеров.
Мы упростили тестирование вплоть до простого обработчика HTTP (работающего на веб-сайте vanilla 4.0), который возвращает возможности браузера только для браузера.
Вот несколько User-агентов, которые не могут быть идентифицированы (они определены как Mozilla 0.0):
-
Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_5_8;+en-us)+AppleWebKit/533.19.4+(KHTML,+like+Gecko)+Version/5.0.3+Safari/533.19.4
-
Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_6_2;+en-us)+AppleWebKit/531.9+(KHTML,+like+Gecko)
-
Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_6_7;+en-us)+AppleWebKit/533.20.25+(KHTML,+like+Gecko)+Version/5.0.4+Safari/533.20.27
-
Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_6_6;+en-us)+AppleWebKit/533.18.1+(KHTML,+like+Gecko)
Код обработчика выглядит следующим образом:
<%@ WebHandler Language="C#" Class="PowershellTemporaryHandler" %>
using System;
using System.Web;
using System.Web.Security;
public class PowershellTemporaryHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
HttpBrowserCapabilities hbc = context.Request.Browser;
context.Response.Write("Type=" + hbc.Type + "<br>");
context.Response.Write("Name=" + hbc.Browser + "<br>");
context.Response.Write("Version=" + hbc.Version + "<br>");
context.Response.Write("Major Version=" + hbc.MajorVersion + "<br>");
context.Response.Write("Minor Version=" + hbc.MinorVersion + "<br>");
context.Response.Write("Platform=" + hbc.Platform + "<br>");
context.Response.Write("Is Beta=" + hbc.Beta + "<br>");
context.Response.Write("Is Crawler=" + hbc.Crawler + "<br>");
context.Response.Write("Is AOL=" + hbc.AOL + "<br>");
context.Response.Write("Is Win16=" + hbc.Win16 + "<br>");
context.Response.Write("Is Win32=" + hbc.Win32 + "<br>");
context.Response.Write("Supports Tables=" + hbc.Tables + "<br>");
context.Response.Write("Supports cookies=" + hbc.Cookies + "<br>");
context.Response.Write("Supports VBScript=" + hbc.VBScript + "<br>");
context.Response.Write("Supports Frames=" + hbc.Frames + "<br>");
context.Response.Write("Supports JavaScript=" + hbc.EcmaScriptVersion.ToString() + "<br>");
context.Response.Write("Supports Java Applets=" + hbc.JavaApplets + "<br>");
context.Response.Write("Supports ActiveX Controls=" + hbc.ActiveXControls + "<br>");
context.Response.Write("User Agent=" + context.Request.UserAgent + "<br>");
}
}
Мы сбиты с толку в связи с отсутствием упоминания в Интернете об этой проблеме. Похоже, что нам нужно добавить настройки браузера либо в папку framework/config/browsers, либо в папку App_Browsers на уровне веб-сайта, но кажется странным, что нам нужно будет настроить определения браузера для веб-сайта .NET 4.0 для правильной работы.
Есть ли у кого-нибудь опыт в этой проблеме?