dar*_*ins 38 ntlm windows-authentication iis-7.5 cors asp.net-web-api
我正在尝试在我的WebAPI项目中启用CORS支持,如果我启用匿名身份验证,那么一切正常,但是使用Windows Auth +禁用匿名身份验证,发送的OPTIONS请求始终返回401未经授权的响应.请求它的站点位于DOMAIN上,因此应该可以进行呼叫,有没有办法解决问题而不禁用Windows身份验证?
Jan*_*nda 37
您只能为匿名用户允许OPTIONS谓词.
<system.web>
<authentication mode="Windows" />
<authorization>
<allow verbs="OPTIONS" users="*"/>
<deny users="?" />
</authorization>
</system.web>
Run Code Online (Sandbox Code Playgroud)
根据W3C规范,浏览器会从CORS预检中删除用户凭据:https://dvcs.w3.org/hg/cors/raw-file/tip/Overview.html#preflight-request
Stu*_*Stu 22
几年后,但是通过@dariusriggins和@ lex-li的回答,我设法将以下代码添加到我的Global.asax:
public void Application_BeginRequest(object sender, EventArgs e)
{
string httpOrigin = Request.Params["HTTP_ORIGIN"];
if (httpOrigin == null) httpOrigin = "*";
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", httpOrigin);
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Token");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
if (Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.StatusCode = 200;
var httpApplication = sender as HttpApplication;
httpApplication.CompleteRequest();
}
}
Run Code Online (Sandbox Code Playgroud)
httpOrigin实际上是在允许的主机列表中查找的,但这只是复杂的事情.这意味着所有其他请求都已经过验证,但选项只会返回.
谢谢你提出这个问题,如果没有它,我会失败的!
dar*_*ins 15
来自MS:
如果禁用匿名身份验证,则设计IIS将向任何请求返回401.如果他们已启用Windows身份验证,那么在这种情况下401响应将具有WWW-Authenticate标头以允许客户端启动身份验证握手.然后问题是客户使用的客户端是否可以进行Windows身份验证.
最后,似乎可能存在一个潜在的问题,即是否可以配置URL以允许一个动词(在本例中为OPTIONS)允许匿名访问,但需要对其他动词进行Windows身份验证.IIS不支持通过简单配置.通过启用匿名和Windows身份验证,在拒绝访问匿名用户的内容上设置ACL,然后为相关URL配置处理程序映射,以便它不验证是否存在,可能会出现此行为与URL关联的文件.但要确认这一点需要一些玩法.
小智 5
解决此问题的最简单方法是使用条件 request_method = ^OPTIONS$ 创建重写规则。然后将操作设置为自定义响应,将其设置为 200 OK。然后所有选项请求将响应 200 而不是 401。这将解决 CORS 问题。
当然,您仍然需要确保拥有正确的跨源请求标头。
这将在启用集成身份验证时停止响应 401 的选项请求(没有任何凭据)。
小智 5
接受的答案是正确的,但是我正在使用“带有 iisnode 和 npm cors 模块的节点”设置对 REST API 进行故障排除一段时间,并且对只为所有用户启用匿名身份验证感到不舒服。由于它是一个节点应用程序,system.web 标签没有太多作用。我最终在 web.config 中添加了以下内容:
<system.webServer>
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
<authorization>
<add accessType="Allow" verbs="OPTIONS" users="?" />
<add accessType="Deny" verbs="GET, PUT, POST, DELETE" users="?" />
</authorization>
</security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
小智 5
扩展@dariusriggins 提供的答案。检查这篇文章:微软| 开发人员:将所有内容放在一起 \xe2\x80\x93 CORS 教程
\n\n对于 IIS 配置:
\n\n授权规则
\n\n\n\n授权阶段(或授权事件),我们需要确保只允许来自 CORS 预检的匿名请求,并要求所有其他传入请求提供身份验证凭据。我们可以通过授权规则来实现这一点。授予所有用户访问该站点的默认授权规则已就位,并由 IIS 默认提供。我们将首先修改此规则,仅允许匿名用户发送使用 OPTIONS http 谓词的请求。以下是 IIS 中此授权规则的目标配置:
\n\n编辑授权规则
\n\n\n| 归档时间: |
|
| 查看次数: |
41436 次 |
| 最近记录: |