Web API 2.1 Windows 身份验证 CORS Firefox

Posted

技术标签:

【中文标题】Web API 2.1 Windows 身份验证 CORS Firefox【英文标题】:Web API 2.1 Windows Authentication CORS Firefox 【发布时间】:2014-04-06 15:54:26 【问题描述】:

场景如下:

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

http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

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

我运行了该项目,并且在 Chrome、IE 和 FireFox 上一切正常(GET、PUT 和 POST)。

然后我在 web api 项目中启用了 Windows 身份验证(是的,我确实需要在 api 项目中进行 win auth)。为了让它工作,我将 xhrFields arg 添加到我的 jquery.ajax 调用中:

        $.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);
        );

另外,我设置了 EnableCorsAttribute.SupportsCredentials 属性 = true

我测试了一切。 Chrome 和 IE 工作,FireFox 没有。 Firefox 收到 401 响应它的预检 (OPTIONS) 请求。

FireFox 似乎没有尝试使用该服务进行身份验证。

有没有人找到解决这个问题的方法?

【问题讨论】:

【参考方案1】:

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

问题在于,当 Firefox 发出 OPTION 请求并被 401 拒绝时,它不再尝试重新进行身份验证。这使我走上了绕过所有 OPTION 请求的身份验证的道路。我找不到关于这个主题的太多信息,但我确实找到了这个:

401 response for CORS request in IIS with Windows Auth enabled

(以下引用原页面内容)

在 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-uris”

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

4) 输入您希望将 NTLM 身份验证信息传递到的站点的 URL,格式为:

http://intranet.company.com,http://email.company.lan

5) 请注意,您可以在此字段中使用逗号分隔列表。

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

脚本可在此处下载。

下载脚本后,您需要从 ZIP 存档中提取它,然后修改以 strSiteList 开头的行。

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

您可以通读脚本的其余部分以获取更多信息。如果您有任何问题、cmets 或疑虑,请告诉我。

基于此,我在 api 项目的设置中将匿名身份验证设置为 Enabled(我仍然将 Windows 身份验证设置为 Enabled)。

运行项目(mvc 和 api)后,发出 CORS 请求时提示我输入凭据。提供我的凭据后,我能够成功地使用 Firefox 进行 GET/POST/PUTS。

为了消除 Firefox 中的凭据提示,我收到了来自 Brock Allen 的提示,该提示引导我走上了启用 NTLM 身份验证的道路。我发现了一个帖子 here,其中提供了有关如何更改适当设置的说明。

将“http://localhost”添加到 network.negotiate-auth.trusted-uris 设置后,我现在可以使用 Firefox 针对所有动词发出 CORS 请求,而无需提示输入凭据。

【讨论】:

刚刚对您链接的 SO 线程发表了评论。即使启用了 Windows 身份验证,对于 IIS 7+ 集成模式,您也可以正确响应 HTTP 模块中的 CORS 预检请求。 避免提示凭据的解决方案链接已损坏 @thebenman 我从谷歌缓存中获取了内容并将其添加到帖子中并删除了链接【参考方案2】:

我目前正在解决这个问题,启用匿名身份验证的解决方案是我不太喜欢的。 所以挣扎了一下,我找到了answer 中描述的正确组合。 我仍然不是 100% 高兴,我想避免全局 asax 中的代码,但通过 web 配置我没有成功 jet。

我希望这会有所帮助。

【讨论】:

以上是关于Web API 2.1 Windows 身份验证 CORS Firefox的主要内容,如果未能解决你的问题,请参考以下文章

实施 Identity 2.1 + OWIN OAuth JWT 不记名令牌时如何从 Web API 控制器端点进行身份验证

向 ASP.NET Core 2.1 Web API 添加 JWT 身份验证时是不是需要创建像 AspNetUsers 这样的表?

无法使用 Windows 身份验证发布到 asp.net core web api

带有 Windows 身份验证的 Web api 中的 Cors 问题

如何将 Web api Windows 身份验证与 Angular 应用程序一起使用 [重复]

OWIN 托管的 web api:使用 windows 身份验证并允许匿名访问