在 ASP.NET 核心 MVC 项目上启用 CORS

Posted

技术标签:

【中文标题】在 ASP.NET 核心 MVC 项目上启用 CORS【英文标题】:Enable CORS on an ASP.NET core MVC project 【发布时间】:2020-12-06 00:37:38 【问题描述】:

当我终于明白我的问题是 CORS 阻止了我时,我需要将用户重定向到另一个页面也许有人能发现我的错误?

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        
        else
        
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        
        app.UseHttpsRedirection();
        _scheduler.JobFactory = new AspnetCoreJobFactory(app.ApplicationServices);
        app.UseSession();
        app.UseStaticFiles();
        app.UseCors(MyAllowSpecificOrigins);
        app.UseAuthentication();
        app.UseRouting();
        app.UseAuthorization();
        app.UseCookiePolicy();
        app.UseEndpoints(endpoints =>
        
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "controller=Users/action=Dashboard/id?");
        );
    

public void ConfigureServices(IServiceCollection services)
    
        FACEBOOK_APP_ID = _config.GetValue<string>("FACEBOOK_APP_ID");
        FACEBOOK_APP_SECRET = _config.GetValue<string>("FACEBOOK_APP_SECRET");
        services.AddHttpsRedirection(options =>
        
            options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
            options.HttpsPort = 44300;
        );
        services.AddHttpClient();
        services.AddCors(options =>
        
            options.AddPolicy(name: MyAllowSpecificOrigins,
                              builder =>
                              
                                  builder.AllowAnyOrigin()
           .AllowAnyMethod()
           .AllowAnyHeader();
                              );
        );
        services.AddMvc();
        services.AddIdentity<ApplicationUser, IdentityRole>(options => options.User.AllowedUserNameCharacters = null).AddEntityFrameworkStores<AppDbContext>();
        services.AddControllersWithViews();
        services.AddDbContextPool<AppDbContext>(options => options.UseSqlServer(_config.GetConnectionString("AutoLoverDbConnection"), x => x.MigrationsAssembly("AutoMatcherProjectAss")).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
        services.AddTransient<AppDbContext>();
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
        services.AddSingleton<ISessionManager, ClientSIdeSessionManager>();
        services.AddHttpContextAccessor();
        services.AddSession();
        services.Configure<CookiePolicyOptions>(options =>
        
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => false;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        );
        services.AddDistributedMemoryCache();
        services.AddSession(options =>
        
            options.IdleTimeout = TimeSpan.FromMinutes(60);//You can set Time   
            options.Cookie.HttpOnly = true;
        );
        services.AddTransient<ISche, SchedulerImpl>();
        services.AddTransient<IQueue, QueueImpl>();
        services.AddTransient<SchedulerJob>();
        services.AddTransient<IBotFactory, BotFactory>();
        services.AddTransient<IJsonFactory, JsonFactory>();
        services.AddTransient<ICredentialDb, CredentialDb>();
        services.AddSingleton(provider => _scheduler);
        services.AddAuthentication().AddFacebook(options =>
        
            options.AppId = FACEBOOK_APP_ID;
            options.AppSecret = FACEBOOK_APP_SECRET;
            options.SaveTokens = true;

        );

        _scheduler.Clear();
    

控制器:

    [HttpPost]
    public async Task<IActionResult> AuthenticateInstagramAPI(Service service)
    

        return new RedirectResult("https://www.instagram.com/");

    

错误:

从源“https://localhost:44300”访问“https://www.instagram.com/”(从“https://localhost:44300/Actions/AuthenticateInstagramAPI”重定向)的 XMLHttpRequest 已被阻止通过 CORS 策略:在预检响应中 Access-Control-Allow-Headers 不允许请求标头字段 x-requested-with。

编辑----------

客户端 AJAX 调用:

function AuthInstagram() 
    var service = $('#userServicesDropDownAuth :selected').text()
    $.ajax(
        url: '/Actions/AuthenticateInstagramAPI',
        method: 'POST',
        data: service ,
        dataType: 'json',
        success: function (data) 
            console.log(data);
        ,
        error: function (error) 
            //alert(error+"11");
        
    )   

【问题讨论】:

你看过***.com/questions/31942037/…吗? 可以分享客户端代码吗? @taylorswiftfan 是的,没用。 @YiyiYou yes 正在编辑 【参考方案1】:

在您的 startup.cs 中。您将 app.UseCors(MyAllowSpecificOrigins); 放在 app.UseStaticFiles();app.UseAuthentication(); 之间

而在doc,Calls the UseCors extension method and specifies the _myAllowSpecificOrigins CORS policy. UseCors adds the CORS middleware. The call to UseCors must be placed after UseRouting, but before UseAuthorization. For more information, see Middleware order.

所以你可以像这样改变你的数据:

    app.UseRouting();

    app.UseCors(MyAllowSpecificOrigins);


    app.UseAuthorization();

【讨论】:

【参考方案2】:

想通了。

事实证明,如果您向控制器操作发送 AJAX 获取请求,并尝试从该操作重定向它不会起作用。 可能是 AJAX 添加了一些标头,或者 AJAX 调用没有通过中间件管道?不知道,如果有人知道我为什么会应用它的答案!

【讨论】:

以上是关于在 ASP.NET 核心 MVC 项目上启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

Razor 在项目中不工作,但在 asp.net mvc 中工作

如何使用 Angular 2 在 POST 上启用 ASP.NET MVC 4 中的跨源请求

具有捆绑和缩小功能的 ASP.NET MVC 4 应用程序,为啥在调试模式下启用缩小?

Jquery 验证单击提交按钮两次 ASP.Net 核心 MVC 项目

asp.net mvc 应用Bundle(捆绑和微小)压缩技术 启用 BundleConfig 配置web.config

在 ASP.NET MVC 5 应用程序中启用 SSL 会导致 OpenIdConnectProtocolValidator 问题