首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WEB为IOS和提供jQuery Ajax 401

WEB为IOS和提供jQuery Ajax 401
EN

Stack Overflow用户
提问于 2014-09-17 14:48:23
回答 1查看 1.5K关注 0票数 0

当通过jQuery AJAX从iOS Safari/Chrome或Windows7Firefox客户端发出CORS请求时,我看到了401个响应,而不是从IE/Chrome 7客户端生成的。

我有一个ASP.NET MVC 5应用程序,它使用URL调用托管在IIS8.5服务器上的WebApi2.2服务,如

mvc.mydom.com

api.mydom.com

这两个站点的设置都需要windows身份验证。

MVC应用程序使用jQuery Ajax命令向API服务发出请求,如下所示

代码语言:javascript
复制
    $.ajax({
        dataType: "json",
        url: http:'//api.mydom.com/Cars/1',
        beforeSend: function (xhr) {
            xhr.withCredentials = true;
        },
        xhrFields: {
            withCredentials: true
        },
        success: function (data) {
             //Do stuff
            });
        },
        error: function (xhr, ajaxOptions, thrownError) {
             //alert stuff
            }
     });

在我的Web应用程序中,我启用了CORS支持,如下所示:

代码语言:javascript
复制
 // configured by application start

config.EnableCors();
config.SetCorsPolicyProviderFactory(new CorsPolicyFactory());

public class CorsPolicyFactory : ICorsPolicyProviderFactory
{
   ICorsPolicyProvider provider = new MisCorsPolicyProvider();

   public ICorsPolicyProvider GetCorsPolicyProvider(System.Net.Http.HttpRequestMessage request)
   {
       return this.provider;
   }
}

public class MisCorsPolicyProvider : ICorsPolicyProvider
{
    private CorsPolicy policy;

    public MisCorsPolicyProvider()
    {
        this.policy = new CorsPolicy
        {
            AllowAnyMethod = true,
            AllowAnyHeader = true,
            SupportsCredentials = true
        };

        this.policy.Origins.Add("http://mvc.mydom.com");
    }

    public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        return Task.FromResult(this.policy);
    }
}

想知道这是否是飞行前请求的问题,我遇到了几个引用,这表明IIS8.5需要对Web进行以下更改。

替换

代码语言:javascript
复制
<system.webServer>
  <handlers>  
    <remove name="OPTIONSVerbHandler"/>
  </handlers>  
<system.webServer>

使用

代码语言:javascript
复制
<system.webServer>
  <handlers>  
    <remove name="OPTIONS"/>
  </handlers>  
<system.webServer>

这没什么帮助。

查看iOS和Firefox上开发工具中的请求,我没有看到证书正在传递,但我在Windows /Chrome中看到了。

坏标题/响应的示例如下:

代码语言:javascript
复制
GET http://api.mydom.com/Cars/1 HTTP/1.1
Host: api.mydom.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://mvc.mydom.com/Home/Index
Origin: http://mvc.mydom.com
Connection: keep-alive

响应

代码语言:javascript
复制
HTTP/1.1 401 Unauthorized
Content-Type: text/html
Server: Microsoft-IIS/8.5
WWW-Authenticate: Negotiate
X-Powered-By: ASP.NET
Date: Wed, 17 Sep 2014 14:25:49 GMT
Content-Length: 1293
Proxy-Support: Session-Based-Authentication

在windows /Chrome网络分析中,我看到一个401错误,然后是对所需资源的200响应。这不会发生在iOS或win Firefox上,让我相信这可能与飞行前请求失败有关,但是请求不是GET的选择。我以为飞行前的要求是个选择

想知道我错过了什么吗?

更新

好的,我认为可能是因为我和Firefox和iOS正确地实现了W3C规范,该规范规定飞行前请求不应该传递用户凭据;因为IIS是为了要求windows身份验证而设置的,请求失败时会出现401.2错误。嗯,铬似乎继续和认证,因此成功。因此,我想是否有一种方法,我可以关闭窗口身份验证的选项请求?

EN

回答 1

Stack Overflow用户

发布于 2015-01-11 12:21:08

刚刚注意到,当他们的Web受到Windows身份验证之类的保护时,许多人已经经历了401错误。CORS飞行前请求不包含凭据,因此IIS将在ASP.NET触及它们之前就使用401.2进行响应。

一个棘手的解决方法是编写一个HTTP模块并将其挂接到IIS管道上,该管道在HttpApplication.BeginRequest事件上注册,在该事件中,该模块返回对飞行前请求的预期200响应。

此解决方案仅适用于IIS 7+集成模式。

您可以阅读包含更多详细信息的我的博客文章

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25893793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档