现在客户想要访问由
example_services.com 通过 Windows 身份验证。因此这里两者都是
托管在不同的域(跨域)。
首先,您需要启用跨域资源共享。如果你对这个概念不熟悉,我推荐你RFC6454
在 WebAPI 中启用 CORS 非常非常简单(实际上在大多数 Web 框架中都可以使用)。
您将要在 WebAPI 项目中引用 System.Web.Cors。然后,要启用基于控制器的共享,请使用以下属性装饰您的 ApiController
using System.Web.Http;
namespace Example.WebAPI.Controllers
{
[EnableCors(origins:"example_client.com", headers:"*",methods:"*",SupportsCredentials=true)]
public class ExampleController : ApiController
{
//The kickers in that attribute are the "origins" and "SupportsCredentials"
//Note that SupportsCredentials is not supported with wildcard origins
}
}
这样做是根据设置的有效 [Origin] 请求标头设置 [Access-Control-Allow-Origin] 响应标头。这样做应该会向调用客户端打开您的 WebAPI。
正如您可能想象的那样,属性的“方法”属性允许您锁定特定的 HttpVerb 以进行访问。
如何将“登录用户”的凭据传递给服务。
该属性上还有一个“SupportsCredentials”属性,可让您通过请求传递凭据。
如果您尝试使用 NTLM 身份验证,请将 EnableCors 属性的“SupportsCredentials”属性设置为 true。这将启用Access-Control-Allow-Credentials HTTPHeader。您的凭据不会自动发送,但您可以通过在 XHR 上设置 withCredentials: true 来发送凭据。
如果您的客户对基本身份验证感到满意,您应该可以通过以下方式做到这一点:
$.ajax({
url: url,
data: {},
username: "corp.domain\corp.username"
password: "69iNgCh1pmunk5"
xhrFields: {
withCredentials: true
}
});
CORS and Windows Authentication
More About Origin, Access-Control-Allow-Origin, and CORS
Enabling Cross Origin Requests in Web API
是否可以绕过“windows authentication windows pop”每次
客户端尝试访问任何服务的时间。
您可能正在寻找单点登录解决方案。它们也很重要。
[编辑]
启用 CORS 的端点上的 withCredentials 和 basicAuth 属性应绕过质询弹出窗口。我最初对这个问题的理解是错误的。