当前位置: 首页 > 知识库问答 >
问题:

Angular 8在使用ASP NET Core 3.1 Web Api时出现CORS策略问题

慕容宏毅
2023-03-14

我在开发Angular 8,ASP NET Core Web Api Web应用程序时遇到了CORS策略的问题。我的角应用程序运行在http://localhost:4200有一个服务创建与Web Api通信。它看起来如下

@Injectable({
  providedIn: 'root'
})
export class AuthenticationService {

  apiUrl: string = "";
 

  constructor(private http: HttpClient) {
 
    this.apiUrl = 'https://localhost:44316';
  }

 
  login(Username: any, Password: any){  
    return this.http.post<Observable<ResultItem<AuthenticationResponse>>>(this.apiUrl + "/api/User/Authenticate", {Username: Username, Password: Password});
  }
 
}

服务稍后在组件中调用,但它只是简单地注入,并与subscribe方法一起使用。

 onLogin(){  
    this.authenticationService.login(this.loginFormValues.username.value, this.loginFormValues.password.value).subscribe(
       result => {}); 
  }

WebApi正在单独运行,https://localhost:44316/Angular调用的方法的终结点如下所示:

[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
    private readonly IUserService userService;

    public UserController(IUserService userService)
    {
        this.userService = userService;
    }


    [HttpPost("Authenticate")]
    public async Task<IActionResult> Authenticate(AuthenticationModel model)
    {
        return Ok(await userService.Login(model));
    }
}

我最关心的是我的启动文件。到目前为止,我试图改变那里的CORS设置,但没有成功的结果。Startup.cs文件的代码如下。

简要说明:

ConfigureServices方法中的两行代码使用了我的一些外部函数,其目的是:

>

  • addSubstracture:将所有存储库注册为瞬态,并将DbContext注册。

    addApplication:将存储库上一层的服务注册为瞬态

    Startup.cs代码如下

    public class Startup
    {
        private IServiceCollection _services;
    
        public Startup(IConfiguration configuration, IWebHostEnvironment environment)
        {
            Configuration = configuration;
            Environment = environment;
            SportFacilityUnitSettings = configuration.Get<SportFacilityUnitSettings>();
        }
    
        public IConfiguration Configuration { get; }
        public IWebHostEnvironment Environment { get; }
        public SportFacilityUnitSettings SportFacilityUnitSettings { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
             
            services.AddCors();
            services.AddMvc(option => option.EnableEndpointRouting = false);
    
            services.AddSubstructure(Configuration, Environment, SportFacilityUnitSettings);
            services.AddApplication(); 
            services.AddScoped<IPasswordHasher<User>, PasswordHasher<User>>();
    
            var appSettingsSection = Configuration.GetSection("AppSettings");
            services.Configure<AppSettings>(appSettingsSection);
             
            var appSettings = appSettingsSection.Get<AppSettings>();
            var key = Encoding.ASCII.GetBytes(appSettings.Secret);
    
            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            }); 
            services.AddControllers().AddNewtonsoftJson(options =>
                options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
            );
    
            services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
            services.AddHttpContextAccessor();
    
           
            _services = services;
        }
    
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseCors(
             options => options.SetIsOriginAllowed(x => _ = true).AllowAnyMethod().AllowAnyHeader().AllowCredentials()
         );
            app.UseMvc();
            app.UseHsts();
            app.UseMiddleware<JwtMiddleware>(); 
            app.UseAuthentication();
            app.UseRouting();  
            app.UseHttpsRedirection();  
            app.UseStaticFiles();
            app.UseAuthorization();  
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers(); 
            });
    
        }
    }
    

    当我点击登录按钮,其目的是发送请求,我收到以下错误在网络浏览器控制台。

    访问位于“”的XMLHttpRequesthttps://localhost:44316/api/User/Authenticate“起源”http://localhost:4200'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origin'标头。

    最奇怪的是,当我调试它,并在Api层设置一个断点,调试器点击它,然后它进入服务层,并在身份验证方法中的某个地方失败。

  • 共有1个答案

    伊裕
    2023-03-14

    转到承载应用程序的IIS,检查是否正确设置了以下信息。

    #第一步:IIS

    #步骤3:如果上述两个步骤不起作用,请确保按照msdn信息为应用程序启用corshttps://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1

    步骤4:: 调查您在Web API中使用的标头信息,以及在您的IIS设置下是否允许(如步骤1所述)

    步骤5::在您的authenticate方法中放置一个断点,查看其失败的位置和原因。您也可以从该错误信息中获得更多线索。

    步骤6:尝试从html" target="_blank">前端启用CrossDomain。

    步骤7:尝试为应用程序(调用应用程序和被调用应用程序)启用https

     类似资料:
    • 我正在尝试创建一个反应应用程序,我需要从 url“https://news.google.com/news/rss”解析一些 RSS 新闻提要,但我收到错误“请求已被 CORS 策略阻止:”请求的资源上不存在'访问控制-允许来源'标头”。我在 Android 应用程序中做了类似的项目,我在 java 中使用 AsyncTasks 获取了一些提要,它没有向我显示任何 CORS 问题,我想了解为什么它

    • 我试图生成一个简单的axios请求,如下所示(我正在使用vue.js): 但我得到以下错误: 我已经尝试过添加下面的头,但仍然不起作用 但是如果我尝试通过浏览器发出请求(简单地通过复制和粘贴url),一切都很好。 有人知道怎么帮我吗?非常感谢!

    • 我试图使用OBJLoader从系统中加载一个对象,但我总是得到CORS错误的提示: 下面是我的代码(task1.js): 这是我的HTML文件: 我在本地使用Three.js。我对Three.js是个新手,所以我不知道哪里出了问题。请帮帮我。

    • “{”版本“:”2012-10-17“、”语句“:[{”SID“:”VisualEditor0“、”Effect“:”Allow“、”Action“:”EC2:RunInstances“、”Resource“:[”arn:aws:ec2:us-East-2:::Instance/“、”arn:aws:ec2:us-East-2::Network-Interface/“、”arn:aws:ec2:u

    • 我试图调用一些API在我的javascript代码中获取。我正在我的机器中使用ReactJs开发,并在同一网络中使用另一台机器中的. net开发API。有了邮递员,我可以调用应用编程接口,但是没有。我尝试调用其他服务器中的另一个API,结果是成功的。 我正在使用fetch并尝试使用axios。我在这个API的堆栈溢出中发现了另一个问题:https://gturnquist-quoters.cfap

    • 问题内容: 我在package.json中添加了proxy,效果很好,但是在npm run build之后,CORS问题再次浮出水面,有人知道在React中npm run build之后如何处理CORS问题。 我试图使用各种方法在axios请求中添加标头。但是,我未能在axios请求中添加’Access-Control-Allow- Origin’:’*’。我的代码如下: package.json