检查浏览器是否为chrome或edge

时间:2015-08-07 06:07:06

标签: c# .net google-chrome microsoft-edge

我当前的网站仅在Chrome浏览器中运行,为此,我已按以下方式检查

if (Request.Browser.Browser == "Chrome")
{
   // Allow
}

但对于Edge,它仅返回"Chrome"

如何仅允许从Chrome浏览器进行访问?

4 个答案:

答案 0 :(得分:17)

您可以检查用户代理并查看它是否是Microsoft Edge,因为Microsoft Edge在其用户代理字符串中包含Edge/version

//get user agent somehow here based on what you are working on
userAgent = Request.UserAgent;

if (userAgent.IndexOf("Edge") > -1)
{
   // maybe client's browser is Microsoft Edge
}

Edge用户代理字符串样本

Mozilla/5.0 (X11; CrOS x86_64 6783.1.0) AppleWebKit/537.36 (KHTML, like Gecko) Edge/12.0

查看更多herehere

最后,我建议在浏览器上使用功能检测,而不是基于用户代理进行操作。

答案 1 :(得分:2)

我很好奇 - 用例是什么?无论如何,你走了:

Microsoft Edge UA字符串:

Mozilla / 5.0(Windows NT 10.0)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 42.0.2311.135 Safari / 537.36 Edge / 12.10136

I detail why in this blog post.

Neowin最近报道微软新推出的适用于Windows 10的浏览器Spartan使用Chrome UA字符串,“Mozilla / 5.0(Windows NT 10.0; WOW64)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 39.0.2171.71 Safari / 537.36 Edge / 12.0“。 这是故意的。

您还会注意到整个字符串以“Edge / 12.0”结尾,而Chrome则没有。

我应该指出,这与微软对IE 11的做法不同,后者在Windows 8上读取:Mozilla / 5.0(Windows NT 6.3; Trident / 7.0; rv:11.0),如Gecko,在这篇文章中解释过。

什么是用户代理嗅探?

通常,网络开发人员会UA嗅探浏览器检测。 Mozilla在他们的博客上解释得很好:

向不同的浏览器提供不同的网页或服务通常是一个坏主意。无论用户使用哪种浏览器或设备,Web都可供所有人访问。有一些方法可以开发您的网站,以便根据功能的可用性逐步增强自身,而不是针对特定的浏览器。

Here’s a great article explaining the history of the User Agent.

通常,懒惰的开发人员只会嗅探UA字符串并根据他们认为观看者正在使用的浏览器禁用其网站上的内容。 Internet Explorer 8是开发人员常见的挫折点,因此他们会经常检查用户是否使用任何版本的IE,并禁用功能。

The Edge team details this even deeper on their blog.

所有用户代理字符串都包含有关除您使用的实际浏览器之外的其他浏览器的更多信息 - 不仅包括令牌,还包含“有意义”的版本号。

Internet Explorer 11的UA字符串:

Mozilla / 5.0(Windows NT 6.3; Trident / 7.0; rv:11.0),如Gecko

Microsoft Edge UA字符串:

Mozilla / 5.0(Windows NT 10.0)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 42.0.2311.135 Safari / 537.36 Edge / 12.10136

Patrick H. Lauke在W3C讨论中恰当地将userAgent属性描述为“一堆不断增长的谎言”。 (“或者更确切地说,添加足够的遗留关键字的平衡行为不会立即使旧的UA嗅探代码崩溃,同时仍然试图传达一些实际有用和准确的信息。”)

我们建议Web开发人员尽可能避免UA嗅探;现代网络平台功能几乎都可以通过简单的方式检测到。在过去的一年中,我们已经看到一些UA嗅探网站已被更新以检测Microsoft Edge ...仅为其提供传统的IE11代码路径。这不是最好的方法,因为Microsoft Edge匹配'WebKit'行为,而不是IE11行为(任何Edge-WebKit差异都是我们有兴趣修复的错误)。

根据我们的经验,Microsoft Edge在这些站点中的“WebKit”代码路径上运行得最好。此外,随着互联网在更广泛的设备上可用,请假设未知的浏览器是好的 - 请不要限制您的网站只在一小部分当前已知的浏览器上工作。如果你这样做,你的网站将来几乎肯定会破产。

<强>结论

通过展示Chrome UA字符串,我们可以解决这些开发人员正在使用的黑客攻击,为用户提供最佳体验。

答案 2 :(得分:1)

if(HttpContext.Current.Request.UserAgent.Contains("Edge"))
{
   // Allow
}

为我工作。

答案 3 :(得分:0)

我在记录JavaScript错误时使用浏览器检测,因为知道错误发生在哪个浏览器中很有用。

最初来自this question我在App_Browsers文件夹中使用了一个条目:

<browser id="Edge" parentID="Chrome">
  <identification>
    <userAgent match="Edge/(?'version'(?'major'\d+)(?'minor'\.\d+))" />
  </identification>
  <capabilities>
    <capability name="browser" value="Edge" />
    <capability name="version" value="${version}" />
    <capability name="majorversion" value="${major}" />
    <capability name="minorversion" value="${minor}" />
  </capabilities>
</browser>

但这是不一致的,有时仍然报告Chrome,所以现在我另外使用这个包装类:

using System.Web;

public class BrowserInfo
{
    public BrowserInfo(HttpRequestBase request)
    {
        if (request.Browser != null)
        {
            if (request.UserAgent.Contains("Edge")
                && request.Browser.Browser != "Edge")
            {
                Name = "Edge";
            }
            else
            {
                Name = request.Browser.Browser;
                Version = request.Browser.MajorVersion.ToString();
            }
            Browser = request.Browser;
            Platform = request.Browser.Platform;
            IsMobileDevice = request.Browser.IsMobileDevice;
            if (IsMobileDevice)
            {
                Name = request.Browser.Browser;
                Name = request.Browser.Browser;
            }
        }
    }

    public HttpBrowserCapabilitiesBase Browser { get; }
    public string Name { get; }
    public string Version { get; }
    public string Platform { get; }
    public bool IsMobileDevice { get; }
    public string MobileBrand { get; }
    public string MobileModel { get; }
}