【问题标题】:How to fix "Access to XMLHttpRequest at 'http://localhost:51255/token' from origin 'http://localhost:4200' has been blocked by CORS policy如何修复“从源 'http://localhost:4200' 访问 'http://localhost:51255/token' 的 XMLHttpRequest 已被 CORS 策略阻止
【发布时间】:2019-05-14 09:01:43
【问题描述】:

我尝试在 dotnet webapi 项目和 angular6 项目之间进行通信。

场景:当我输入登录名和密码并单击登录按钮时,它应该从服务器获取 access_token、用户名并将结果显示在 displayresult.html 中。 我知道以前有人问过这个问题,但即使在尝试了所有这些之后 解决方案,我无法与 dotnetwebapi 交流我的 angular6 项目。

为了修复 CORS 政策,我在我的 dotnetwebapi 项目中进行了一些更改。

  1. ConfigureAuth(IAppBuilder app)startup.auth.cs 中添加了app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

  2. web.config中,添加了自定义headers,请看下面的代码。

authservice.ts

export class AuthService
{
private TokenAPI="http://localhost:51255/token";
    login(username:string,password:string):Observable<TokenParams>
    {
        var headersfortokenapi = new Headers({'Content-Type':'application/x-www-form-encoded'});
        var data="grant_type=password&username=" + username + "&password=" + password;

        return this.objhttp.post(this.TokenAPI,data,{ headers:headersfortokenapi})
        .pipe(
            map(res=>res.json()
             )
            );      
    }
}

Login.component.ts


 OnLoginClick()  
{   
this.objauthservice.login(this.username,this.password)
.subscribe
(
 data=>
  {
    this.tokenparam=data;
   this.objauthservice.AccessToken=this.tokenparam.access_token;
    this.objroute.navigate(['/Displayproducts']);
  }
) 
 }

当我点击登录页面中的登录按钮时,它会转到上述方法并调用 authservice 登录方法。 现在我创建了TOKENWEBAPIPROJECT dotnet 项目。 该项目在http://localhost:51255/token 中运行。 我在TOKENWEBAPIPROJECT中做了一些更改的代码sn-p。

startup.cs

 public void ConfigureAuth(IAppBuilder app)
        {
//it has the default code for connecting to dbcontext and application
 app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
}

web.config

<system.webServer>
    <httpProtocol>
      <customHeaders>
     <add name="Access-Control-Allow-Origin" value="http://localhost:4200" />
 <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS,token"/>
 <add name="Access-Control-Allow-Headers" value="Origin, application/x-www-form-encoded, Content-Type, X-Auth-Token" />
      </customHeaders>
    </httpProtocol>
</system.webServer>

我在 Postman 中测试了http://localhost:51255/token 的 post 请求。 在这里我发送用户名、密码、grant_type=password 并返回正确的 access_token、用户名、token_type 等。

预期:当我输入登录名和密码并单击登录按钮时,它应该从服务器获取 access_token、用户名并在displayresult.html 中显示结果。

实际:相反,我收到以下错误:- 1.OPTIONS http://localhost:51255/token 400 (Bad Request)

  1. Access to XMLHttpRequest at 'http://localhost:51255/token' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

【问题讨论】:

  • 您可以尝试将您的 值更新为“*”吗?
  • 是的,我试过了,然后也会发生同样的错误。
  • 我认为您还必须在 webapi 后端允许标头 X-Requested-With

标签: cors rxjs angular6 asp.net-web-api2 owin


【解决方案1】:

Access-Control-Allow-Origin 响应和Origin 请求中的端口号必须相同。

参考:

没有由特定主机名唯一标识和/或映射到特定端口的 Web 应用程序不一定具有唯一的来源,因此将无法安全地利用本规范中定义的机制。这是因为来源仅由方案、主机名和端口组成

https://www.w3.org/TR/cors/

另请参阅管理预检请求的答案:

CORS - How do 'preflight' an httprequest?

您必须发送状态代码 200 以响应 OPTIONS 预检请求。

【讨论】:

  • Dotnet Webapi URL: 'localhost:51255/token' 和 Angular 项目 URL: localhost:4200 。端口号如何相同,两者是不同的技术。你能告诉我应该在 Access-Control-Allow-Origin 中提供哪个端口
  • 请求的资源必须允许请求的资源被请求。如果您的请求从 4200 变为 51255,则您必须在 51255 上允许 4200。您收到的错误消息清楚地说明了哪个部分应该出现在哪个响应中。
  • 是的,为此我只在 web.config 中将 access-control-allow-origin 添加为 localhost:4200 并在我的 DotnetWebAPI 项目中添加了 EnableCors。我在 DotnetWebAPI 项目中的配置是否正确?
猜你喜欢
  • 2019-10-31
  • 2020-01-26
  • 2020-07-09
  • 1970-01-01
  • 2019-11-17
  • 2021-12-26
  • 1970-01-01
  • 2020-10-12
  • 2023-03-27
相关资源
最近更新 更多