【问题标题】:Cross domain issues while accessing ASP.NET Web API Restful services:访问 ASP.NET Web API Restful 服务时的跨域问题:
【发布时间】:2014-12-07 21:24:03
【问题描述】:

情况如下:

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

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

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

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

所以我有以下问题:

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

【问题讨论】:

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


    【解决方案1】:

    首先,您需要在 Web API 中启用跨域请求。按照以下链接中的说明进行操作Enabling Cross-Origin Requests

    然后,您必须在从客户端向您的 Web API 发出任何请求时传递凭据。从以下链接查看传递凭据的信息Passing Credentials in Cross-Origin Requests

    希望这会有所帮助。

    问候 阿卡达斯

    【讨论】:

      【解决方案2】:

      现在客户想要访问由 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 属性应绕过质询弹出窗口。我最初对这个问题的理解是错误的。

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 1970-01-01
        • 2014-11-11
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 2015-10-21
        相关资源
        最近更新 更多