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

Asp.net mvc 访问ASP.NET Web API Restful服务时出现跨域问题:,asp.net-mvc,asp.net-web-api,cross-domain,windows-authentication,impersonation,Asp.net Mvc,Asp.net Web Api,Cross Domain,Windows Authentication,Impersonation,情况如下: 服务托管在假定示例_Services.com上。这些服务是ASP.NET Web API Restful服务。 此服务器上已启用Windows身份验证(NTLM) 客户端托管在假定示例_Client.com上。这是在MVC ASP.NET中实现的。 此服务器上已启用Windows身份验证(NTLM)。 此服务器上还启用了ASP.NET模拟 现在,客户端希望通过Windows身份验证访问example_services.com提供的所有服务。 因此,在这里,两者都托管在不同的域上(跨域

情况如下:

  • 服务托管在假定示例_Services.com上。这些服务是ASP.NET Web API Restful服务。 此服务器上已启用Windows身份验证(NTLM)

  • 客户端托管在假定示例_Client.com上。这是在MVC ASP.NET中实现的。 此服务器上已启用Windows身份验证(NTLM)。 此服务器上还启用了ASP.NET模拟

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

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

    因此,我有以下问题:

  • 如何将“已登录用户”的凭据传递给服务
  • 每次客户端尝试访问任何服务时,是否可以绕过“windows身份验证windows pop”

  • 首先,您需要在Web API中启用跨源请求。按照以下链接中的说明进行操作

    然后,您必须在从客户端向web API发出任何请求时传递凭据。请参阅有关从以下链接传递凭据的信息

    希望这有帮助

    问候
    Arkadas

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

    然后,您必须在从客户端向web API发出任何请求时传递凭据。请参阅有关从以下链接传递凭据的信息

    希望这有帮助

    问候 阿卡达斯

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

    首先,您需要启用跨源资源共享。如果你不熟悉这个概念,我建议你

    在WebAPI中启用CORS非常非常简单(实际上,在大多数web框架中都是如此)。 您需要在WebAPI项目中引用
    System.Web.Cors
    。然后,要启用基于控制器的共享,请使用以下属性装饰ApicController

    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上设置
    with credentials:true
    来发送凭据

    如果您的客户对basic auth感到满意,您应该能够通过以下方式完成:

    $.ajax({
       url: url,
       data: {},
       username: "corp.domain\corp.username"
       password: "69iNgCh1pmunk5"
       xhrFields: {
          withCredentials: true
       }
    });
    



    是否可以绕过“windows身份验证windows pop” 客户端尝试访问任何服务的时间

    您可能正在寻找单一登录解决方案。它们也不平凡

    [编辑]

    启用CORS的端点上的withCredentials和basicAuth属性应绕过质询弹出窗口。我最初对这个问题的解释是错误的

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

    首先,您需要启用跨源资源共享。如果你不熟悉这个概念,我建议你

    在WebAPI中启用CORS非常非常简单(实际上,在大多数web框架中都是如此)。 您需要在WebAPI项目中引用
    System.Web.Cors
    。然后,要启用基于控制器的共享,请使用以下属性装饰ApicController

    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上设置
    with credentials:true
    来发送凭据

    如果您的客户对basic auth感到满意,您应该能够通过以下方式完成:

    $.ajax({
       url: url,
       data: {},
       username: "corp.domain\corp.username"
       password: "69iNgCh1pmunk5"
       xhrFields: {
          withCredentials: true
       }
    });
    



    是否可以绕过“windows身份验证windows pop” 客户端尝试访问任何服务的时间

    您可能正在寻找单一登录解决方案。它们也不平凡

    [编辑]

    启用CORS的端点上的withCredentials和basicAuth属性应绕过质询弹出窗口。我最初对这个问题的解释是错误的