情况如下:
服务托管在假设example_services.com上。这些服务是ASP.NET Web API Restful服务。 Windows身份验证(NTLM)已启用此功能。
客户端位于假设example_client.com。这是在MVC ASP.NET中。 在此启用Windows身份验证(NTLM)。 此模型也启用了ASP.NET模拟。
现在,客户端希望通过Windows身份验证访问example_services.com提供的所有服务。 因此,这两者都托管在不同的域(跨域)。
Windows身份验证在客户端正常运行,但我们在example_client.com中从example_services.com访问服务时收到401(访问被拒绝错误)。
所以我有以下问题:
答案 0 :(得分:4)
首先,您需要在Web API中启用跨源请求。按照以下链接Enabling Cross-Origin Requests
中的说明进行操作然后,您必须在从客户端向Web API发出任何请求时传递凭据。请参阅以下链接Passing Credentials in Cross-Origin Requests
中传递凭据的信息希望这有帮助。
此致 Arkadas
答案 1 :(得分:3)
现在客户想要访问所提供的所有服务 Windows身份验证的example_services.com。因此这两者都是 托管在不同的域(跨域)。
首先,您需要启用跨源资源共享。如果您不熟悉这个概念,我会推荐您RFC6454
在WebAPI中启用CORS实际上非常简单(实际上在大多数Web框架中)。
您将要在WebAPI项目中引用System.Web.Cors
。然后,要启用基于控制器的共享,请使用以下属性
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到您的呼叫客户端。
如您所想,属性的“methods”属性允许您锁定要访问的特定HttpVerbs。
如何将“登录用户”的凭据传递给服务。
该属性上还有一个“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属性应绕过挑战弹出窗口。我最初解释这个问题是错误的。