Asp.net Web API 2.1 Windows身份验证CORS Firefox

Asp.net Web API 2.1 Windows身份验证CORS Firefox,asp.net,firefox,asp.net-web-api,cors,windows-authentication,Asp.net,Firefox,Asp.net Web Api,Cors,Windows Authentication,以下是场景: 我创建了一个web api项目和一个mvc项目,如下所示: 我通过nuget安装了CORS支持,并添加了EnableCorsAttribute 我运行了这个项目,在Chrome、IE和FireFox上,一切都按预期运行(GET、PUT和POST) 然后,我在web api项目中启用了Windows身份验证(是的,我确实需要在api项目中使用win-auth)。为了实现这一点,我在jquery.ajax调用中添加了xhrFields arg: $.ajax({

以下是场景:

我创建了一个web api项目和一个mvc项目,如下所示:

我通过nuget安装了CORS支持,并添加了EnableCorsAttribute

我运行了这个项目,在Chrome、IE和FireFox上,一切都按预期运行(GET、PUT和POST)

然后,我在web api项目中启用了Windows身份验证(是的,我确实需要在api项目中使用win-auth)。为了实现这一点,我在jquery.ajax调用中添加了xhrFields arg:

        $.ajax({
            type: method,
            url: serviceUrl,
            data: JSON.stringify(foo),
            contentType: 'application/json; charset=UTF-8',
            xhrFields: {
                withCredentials: true
            }
        }).done(function (data) {
            $('#value1').text(data);
        }).error(function (jqXHR, textStatus, errorThrown) {
            $('#value1').text(jqXHR.responseText || textStatus);
        });
此外,我将enableCorSatAttribute.SupportsCredentials属性设置为true

我测试了所有的东西。Chrome和IE起作用了,FireFox没有。Firefox收到401响应其飞行前(选项)请求

FireFox似乎没有试图通过该服务进行身份验证


有人找到了这个问题的解决方案吗?

我想出了一个两部分的解决方案

问题在于,当Firefox发出选项请求并被401拒绝时,它不会进一步尝试重新验证。这使我绕过了所有选项请求的身份验证。我找不到关于这个主题的太多信息,但我确实找到了以下内容:

(以下引用原始页面内容)

在Firefox中启用NTLM身份验证(单点登录)

本指南将介绍如何在Firefox中启用NTLM身份验证(单点登录)

你们中有多少人注意到,当您使用Internet Explorer并浏览到公司内部网页面时,它会自动对您进行身份验证,但当您使用Firefox时,会出现登录框提示

最近,在搜索允许使用Apache进行NTLM身份验证的解决方案时,我偶然发现了如何在Firefox中设置首选项,将NTLM身份验证信息传递给web服务器。首选项为network.automatic-ntlm-auth.trusted-uris

那你怎么做呢

1) 打开Firefox并在地址栏中键入“about:config”。(当然没有引用)

2) 在“筛选器”字段中,键入以下“network.automatic ntlm auth.trusted URI”

3) 双击我们刚才搜索的首选项的名称

4) 以以下形式输入您希望向其传递NTLM身份验证信息的网站的URL:

http://intranet.company.com,http://email.company.lan
5) 请注意,您可以在此字段中使用逗号分隔的列表

6) 更新:我创建了VBScript,可用于通过使用组策略或standalone(如果出于某种原因您想使用它)将此信息插入到users prefs.js文件中

可以在此处下载脚本

下载脚本后,您将希望从ZIP存档中提取脚本,然后修改以strSiteList开头的行

注意:如果用户在执行脚本时打开了Firefox,则此脚本将不会执行其功能。除非出于某种原因,您的组策略在执行此脚本之前启动Firefox,否则通过组策略运行脚本将不会出现问题

您可以通读脚本的其余部分以获取更多信息。如果您有问题、意见或顾虑,请让我知道

基于此,我在api项目的设置中将匿名身份验证设置为启用(我还将Windows身份验证设置为启用

运行项目(mvc和api)后,在发出CORS请求时,系统会提示我输入凭据。在提供了凭据之后,我成功地使用Firefox创建了GET/POST/put

为了消除Firefox中的凭证提示,我收到了一条提示,这条提示引导我走上了启用NTLM身份验证的道路。我发现了一篇文章,提供了如何更改适当设置的说明


添加“
http://localhost
”到网络。协商身份验证受信任的URI设置,我现在可以使用Firefox针对所有动词发出CORS请求,而无需提示提供凭据。

我目前正在解决这个问题,启用匿名身份验证的解决方案是我不喜欢的。 因此,我有点挣扎,找到了本文中描述的正确组合。 我仍然不是100%高兴,我想避免在全球asax的代码,但通过网络配置,我没有成功


我希望这会有所帮助。

刚刚在您链接的SO线程上发布了一条评论。即使启用了Windows身份验证,对于IIS 7+集成模式,您也可以在HTTP模块中正确响应CORS飞行前请求。指向避免提示凭据的解决方案的链接为broken@thebenman我从谷歌缓存中获取了内容,并将其添加到帖子中,删除了链接