访问ASP.NET Web API Restful服务时出现跨域问题:

时间:2014-10-13 10:29:17

标签: asp.net-mvc asp.net-web-api cross-domain windows-authentication impersonation

情况如下:

  1. 服务托管在假设example_services.com上。这些服务是ASP.NET Web API Restful服务。 Windows身份验证(NTLM)已启用此功能。

  2. 客户端位于假设example_client.com。这是在MVC ASP.NET中。 在此启用Windows身份验证(NTLM)。 此模型也启用了ASP.NET模拟。

  3. 现在,客户端希望通过Windows身份验证访问example_services.com提供的所有服务。 因此,这两者都托管在不同的域(跨域)。

    Windows身份验证在客户端正常运行,但我们在example_client.com中从example_services.com访问服务时收到401(访问被拒绝错误)。

    所以我有以下问题:

    1. 如何将“已登录用户”的凭据传递给服务。
    2. 每次客户端尝试访问任何服务时,是否可以绕过“windows authentication windows pop”。

2 个答案:

答案 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。然后,要启用基于控制器的共享,请使用以下属性

装饰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到您的呼叫客户端。

如您所想,属性的“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属性应绕过挑战弹出窗口。我最初解释这个问题是错误的。