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 问题