【发布时间】:2015-02-09 10:38:12
【问题描述】:
我有一个使用 Windows 身份验证运行的 WebAPI 2 REST 服务。它与网站分开托管,因此我使用 ASP.NET CORS NuGet 包启用了 CORS。我的客户网站正在使用 AngularJS。
到目前为止,这是我所经历的:
- 我没有设置 withCredentials,因此 CORS 请求返回 401。通过将 withCredentials 添加到我的 $httpProvider 配置中解决。
- 接下来,我使用通配符来源设置了 EnableCorsAttribute,这在使用凭据时是不允许的。通过设置明确的来源列表来解决。
- 这使我的 GET 请求成功,但我的 POST 发出了预检请求,并且我没有创建任何控制器操作来支持 OPTIONS 动词。为了解决这个问题,我将 MessageHandler 实现为全局 OPTIONS 处理程序。它只是为任何 OPTIONS 请求返回 200。我知道这并不完美,但目前在 Fiddler 中有效。
我被困在哪里 - 我的 Angular 预检调用不包括凭据。根据this answer,这是设计使然,因为 OPTIONS 请求被设计为匿名的。但是,Windows 身份验证使用 401 停止请求。
我尝试将 [AllowAnonymous] 属性放在我的 MessageHandler 上。在我的开发计算机上,它可以工作 - OPTIONS 动词不需要身份验证,但其他动词需要。但是,当我构建并部署到测试服务器时,我的 OPTIONS 请求继续收到 401。
在使用 Windows 身份验证时,是否可以在我的 MessageHandler 上应用 [AllowAnonymous]?如果是这样,有关如何执行此操作的任何指导?或者这是错误的兔子洞,我应该寻找不同的方法?
更新: 我能够通过在 IIS 中的站点上同时设置 Windows 身份验证和匿名身份验证来使其工作。这导致一切都允许匿名,所以我添加了一个全局过滤器 Authorize,同时在我的 MessageHandler 上保留 AllowAnonymous。
但是,这感觉像是一种 hack……我一直都明白,应该只使用一种身份验证方法(不能混合使用)。如果有人有更好的方法,我将不胜感激。
【问题讨论】:
-
您可能应该添加诸如“selfhost”或“owin”之类的标签,因为这与 IIS 之类的东西无关。 :)
-
我使用了本指南codeproject.com/Articles/1119206/…(2016 年发布),与下面的大多数答案非常相似
标签: angularjs iis asp.net-web-api cors windows-authentication