情况如下:
-
服务托管在假设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(拒绝访问错误)。
所以我有以下问题:
- 如何将"已登录用户"的凭据传递给服务
- 每次客户端尝试访问任何服务时,是否可以绕过"windows身份验证窗口弹出"
首先,您需要在Web API中启用交叉原始请求。按照以下链接中的说明启用跨来源请求
然后,您必须在从客户端向web API发出任何请求时传递凭据。请参阅以下链接中的传递凭据信息在跨来源请求中传递凭据
希望这能有所帮助。
问候阿卡达斯
现在客户端希望访问由提供的所有服务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身份验证,请设置;SupportsCredentials";属性设置为true。这将启用Access-Control-Allow-Credentials
HTTPHeader。您的凭据不会自动发送,但您可以通过在XHR上设置withCredentials: true
来发送凭据。
如果你的客户对基本的身份验证很满意,你应该能够通过这种方式做到这一点:
$.ajax({
url: url,
data: {},
username: "corp.domaincorp.username"
password: "69iNgCh1pmunk5"
xhrFields: {
withCredentials: true
}
});
CORS和Windows身份验证
更多关于Origin、Access Control Allow Origin和CORS
在Web API 中启用跨来源请求
是否可以绕过";windows认证windows pop";每一个客户端尝试访问任何服务的时间。
您可能正在寻找单一登录解决方案。它们也不是琐碎的。
[编辑]
启用CORS的端点上的withCredentials和basicAuth属性应绕过质询弹出窗口。我最初把那个问题解释错了。