CORS无效-401

问题描述 投票:1回答:3

[尝试从WebApi中获取数据。这是TypeScript中的服务调用:

GetStatus(hostName: string): any {
    this.Http.post(this.ServiceBaseAddress)
        .success(data => {
            return data;
        });
}

在服务器端,我已完成以下操作以启用CORS:

1:添加NugetPackage Microsoft.ASP.Net.Cors

2:将EnableCors属性添加到一个控制器(我正在尝试调用)

[EnableCors("*", "*", "*")]
public class DeployController : ApiController
{ //...
}

3:在WebApiConfig中启用CORS

public static class WebApiConfig
{
  public static void Register(HttpConfiguration config)
  {
    config.EnableCors(); //...

4:通过Web.config添加定制头(在system.webServer区域中)

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
  </customHeaders>
</httpProtocol>

[我注意到Fiddler似乎进行了一些非常令人讨厌的缓存,这使我不只一次感到困惑...现在,至少,我得到一个包含以下标题的响应:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/10.0
X-SourceFiles: =?UTF-8?B?QzpcRGV2ZWxvcFxTUEFSQ1xEZXZlbG9wXFJ1bnRpbWVcU1BBUkMuTWFuYWdlbWVudEFwaVxNYW5hZ2VtZW50QXBpXGFwaVxkZXBsb3lcZ2V0aG9zdHM=?=
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
Date: Mon, 30 Nov 2015 13:12:48 GMT
Content-Length: 6540
Proxy-Support: Session-Based-Authentication

响应的内容是该服务的401错误站点。

为了使此工作正常,我尝试向WebApis Web.config添加匿名身份验证,但未成功:

<authorization>
  <allow users="*"/>
</authorization>

任何想法我能做什么?我如何认证?


编辑:原来这确实是一个身份验证问题。 WebApi身份验证设置如下:

<authentication mode="Windows" />
  • 当我在IE或Chrome中调用Web服务URI时,得到了预期的响应。
  • [当我在Firefox中调用它,然后按取消而不是输入用户凭据时,我得到的消息与从我的网站进行的http呼叫得到的消息相同-401.2身份验证标头出现问题。

话虽这么说,我需要知道如何告诉Ajax调用以使用我的凭据。

angularjs typescript
3个回答
1
投票

HTTP / 1.1 401未经授权

可能的情况

  • 您未经身份验证即不允许选择。因此,对check cors进行的OPTIONS查询返回401
  • CORS正常运行,但是您的控制器具有未在查询中发送的另一层必需的身份验证(您应该看到.aspxauth或基本身份验证之类的Cookie)

1
投票

我有同样的问题,您应该添加SupportsCredentials选项。

asp.net 4中>

configuration.EnableCors(new EnableCorsAttribute("https://mysite.mydomain.com", "*", "*") 
{
        SupportsCredentials = true 
});

asp.net 5]中的外观如何

private static void ConfigureCors(IServiceCollection services)
{
    services.AddCors();

    var policy = new CorsPolicy();
    policy.Headers.Add("*");
    policy.Methods.Add("*");
    policy.Origins.Add("*");
    policy.SupportsCredentials = true;
    services.ConfigureCors(x => x.AddPolicy(DefaultCorsPolicy, policy));
}

有了这里给出的所有答案以及一些研究,我发现该怎么做-首先,我必须修改angular ajax调用才能像这样传递我的凭据:

this.Http.get(this.ServiceBaseAddress + addressPart, { withCredentials: true });

然后,如@michalczukm所示,我必须将服务配置为接受那些凭据。

作为清理,我将所有与跨域相关的内容移至web.config,并删除了属性

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="http://localhost:59664" />
    <add name="Access-Control-Allow-Credentials" value="true" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" />        
  </customHeaders>
</httpProtocol>

0
投票

有了这里给出的所有答案以及一些研究,我发现该怎么做-首先,我必须修改angular ajax调用才能像这样传递我的凭据:

© www.soinside.com 2019 - 2024. All rights reserved.