.NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect

.NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect

继上一篇 .net core 3 web api jwt 一直 401 为添加JWT-BearerToken认证所述的坑后,
本次为添加CORS跨域,又踩坑了。

自从 .NET Core 2.2 之后,CORS跨域配置代码发生了很大变化。
在 .NET Core 3.1 中,本作者碰到各种HTTP错误,诸如 500、307、401 等错误代码...
在必应Bing和不断Debug调整配置代码位置后,得知:

  1. AllowAnyOrigin 方法,在新的 CORS 中间件已经被阻止使用允许任意 Origin,所以该方法无效。
  2. AllowCredentials 方法,自从 .NET Core 2.2 之后,不允许和AllowAnyOrigin同时调用。
  3. WithOrigins 方法,在 .NET Core 3.1 中有bug,具体原因未知,暂时只能用SetIsOriginAllowed(t=> true)代替,等效.AllowAnyOrigin方法。
  4. 创建项目默认的模板中,app.UseHttpsRedirection()在前面,所以我将app.UseCors()放在它后面,这是导致HTTP 307 Temporary Redirect福报的根本原因之一。
  5. 度娘告诉我,app.UseCors()方法要在app.UseAuthentication()之后,是误人子弟的,其实放在它前面也可以,并且app.UseCors()要在app.UseRouting()之后,app.UseEndpoints()app.UseHttpsRedirection()之前
  6. 使用fetch跨域请求时,要注意controller的action是否有设置除了HttpOptions之外的其它Http Method方法,如果有要加上HttpOptions标记特性,因为fetch跨域请求会先执行OPTIONS预请求。
  7. 使用fetch请求需要JWT认证的接口时,除了在HTTP Headers设置Authorization之外,还需要设置'credentials': 'include'
  8. app.UseXxxxxx方法,引入中间件时,要注意管道(Middleware)注册顺序。

参考:

源代码

以下是在 .NET Core 3.1下经过严谨测试,可以JWT认证CORS跨域IIS托管自寄主运行的源代码,仅供参考。

WebApi.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">  <PropertyGroup>    <TargetFramework>netcoreapp3.1</TargetFramework>    <RootNamespace>WebApi</RootNamespace>  </PropertyGroup>  <ItemGroup>    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.2" />    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.2" />    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.2" />    <PackageReference Include="Microsoft.Extensions.Logging.EventSource" Version="3.1.2" />    <PackageReference Include="Microsoft.Extensions.Logging.TraceSource" Version="3.1.2" />    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.2" />    <PackageReference Include="Microsoft.TeamFoundationServer.Client" Version="16.153.0" />    <PackageReference Include="Microsoft.VisualStudio.Services.Client" Version="16.153.0" />    <PackageReference Include="Microsoft.VisualStudio.Services.InteractiveClient" Version="16.153.0" />    <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.0" />  </ItemGroup></Project>

Program.cs

using Microsoft.AspNetCore.Hosting;using Microsoft.Extensions.Hosting;using Microsoft.Extensions.Logging;using NLog.Extensions.Logging;using System.Diagnostics;using System.IO;namespace WebApi{    public class Program    {        public static void Main(string[] args)        {            CreateHostBuilder(args).Build().Run();        }        public static IHostBuilder CreateHostBuilder(string[] args)        {            return Host.CreateDefaultBuilder(args)                .ConfigureLogging((context, logging) =>                {                    logging.ClearProviders()#if DEBUG                        .AddConsole()                        .AddDebug()                        .AddEventLog()                        .AddTraceSource(new SourceSwitch(nameof(Program), "Warning"), new ConsoleTraceListener())#endif                        .AddNLog();                })                .ConfigureWebHostDefaults(webBuilder =>                {                    webBuilder.UseContentRoot(Directory.GetCurrentDirectory())                       .UseKestrel()                       .UseIISIntegration()                       .UseIIS()                       .UseStartup<Startup>();                });        }    }}

Startup.cs

using MCS.Vsts.Options;using MCS.Vsts.Services;using Microsoft.AspNetCore.Authentication.JwtBearer;using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.HttpOverrides;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Hosting;using Microsoft.IdentityModel.Tokens;using System.Text;namespace WebApi{    public class Startup    {        public IConfiguration Configuration { get; }        public Startup(IConfiguration configuration)        {            Configuration = configuration;        }        public void ConfigureServices(IServiceCollection services)        {            services.AddControllers();            //认证            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)                .AddJwtBearer(options =>                {                    var secretBytes = Encoding.UTF8.GetBytes(Configuration["ServerConfig:Secret"]);                    options.TokenValidationParameters = new TokenValidationParameters()                    {                        IssuerSigningKey = new SymmetricSecurityKey(secretBytes),                        ValidateIssuer = false,                        ValidateAudience = false,                        ValidateActor = false,                        RequireSignedTokens = true,                        RequireExpirationTime = true,                        ValidateLifetime = true                    };                });            //跨域            services.AddCors(options =>            {                options.AddDefaultPolicy(builder =>                {                    builder                    //允许任何来源的主机访问                    //TODO: 新的 CORS 中间件已经阻止允许任意 Origin,即设置 AllowAnyOrigin 也不会生效                    //AllowAnyOrigin()                    //设置允许访问的域                    //TODO: 目前.NET Core 3.1 有 bug, 暂时通过 SetIsOriginAllowed 解决                    //.WithOrigins(Configuration["CorsConfig:Origin"])                    .SetIsOriginAllowed(t=> true)                    .AllowAnyMethod()                    .AllowAnyHeader()                    .AllowCredentials();                });            });            //TODO: do something...        }        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            else            {                //Enabled HSTS                app.UseHsts();            }            //TODO: 要放在UseCors之后            //app.UseHttpsRedirection();            app.UseRouting();            app.UseForwardedHeaders(new ForwardedHeadersOptions            {                ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto            });            //TODO: UseCors要在UseRouting之后,UseEndpoints 和 UseHttpsRedirection 之前            app.UseCors();            app.UseAuthentication();            app.UseAuthorization();            app.UseHttpsRedirection();            app.UseEndpoints(endpoints =>            {                endpoints.MapControllers();            });        }    }}

appsettings.json

{  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft": "Warning",      "Microsoft.Hosting.Lifetime": "Information"    }  },  "AllowedHosts": "*",  "https_port": 44370,  "urls": "http://*:50867",  "ServerConfig": {    "Secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  },  "CorsConfig": {    "BaseUri": "http://myserver"  }}
(0)

相关推荐

  • .NET 6 Preview 3 中 ASP.NET Core 的更新和改进

    原文:bit.ly/2Qb56NP作者:Daniel Roth译者:精致码农-王亮.NET 6 预览版 3 现已推出,其中包括许多对新的 ASP.NET Core 改进.以下是本次预览版的新内容:更小 ...

  • ASP.NET Core3基础:01. 示例项目搭建与启动顺序

    一.新建示例项目可以通过dotnet cli和visual studio进行创建项目,这里使用vs进行新建这里选择ASP.NET Core Web应用程序 这里选择API,并且把HTTPS的勾去掉,点 ...

  • C#+web=? 微软Blazor

    C#开发可以用Blazor在今后写前端渲染的网页了!   - C#(C sharp)是什么? C#是微软公司发布的一种面向对象的.运行于.NET Framework和.NET Core(完全开源,跨平 ...

  • ASP.NET Core 5.0 Web API 自动集成Swashbuckle

    dotNET跨平台 今天 以下文章来源于UP技术控 ,作者conan5566 UP技术控不止IT 还有生活 ASP.NET Core 5.0 Web API与开放源代码项目 Swashbuckle.A ...

  • WPF dotnet core 的 Blend SDK Behaviors 库

    之前版本是通过安装 Blend SDK 支持 Behaviors 库的,但是这个方法都是通过引用 dll 的方式,不够优雅.在升级到 dotnet core 3.0 的时候就需要使用 WPF 官方团队 ...

  • Hosting in .NET Core

    Johnny Qian dotNET跨平台 今天在.NET Core中,Host负责应用程序的启动和生命周期管理.除此之外,在Host中还可以设置日志(Logging).配置(Configuratio ...

  • 如何在 40 秒内创建一个.Net Core Web API?

    WEB前端开发社区 今天 为什么我们需要自己写代码?为什么计算机无法自动为我们生成这些代码呢?很显然,我们应该可以利用这些共同点,从一个给定的数据库自动化构建系统--这就是"我"创 ...

  • 使用ASP .NET Core Razor页面,Web API和实体框架进行分页和排序

      如何实现分页和排序以产生良好的性能     如何使用.NETCoreRazor页面,WebAPI和实体框架实现分页和排序以产生良好的性能.     该项目的特点是:     选择页面大小     ...

  • 详解Net Core Web Api项目与在NginX下发布

    前言 本文将介绍Net Core的一些基础知识和如何NginX下发布Net Core的WebApi项目. 测试环境 操作系统:windows 10 开发工具:visual studio 2019 框架 ...

  • dotNET Core 3.X 使用 Web API

    现在的 Web 开发大多都是前后端分离的方式,后端接口的正确使用显得尤为重要,本文讲下在 dotNET Core 3.X 下使用 Web API . 环境 操作系统:Mac IDE:Rider dot ...

  • 针对ASP.NET Core Web API的先进架构

    WEB前端开发社区 昨天.NET Core 最初是在2016年发布的,随着.NET Core 2.0的发布,微软拥有了下一个通用.模块化.跨平台和开源的平台主版本..NET Core已经创建了许多AP ...

  • 搭建ASP.NET WEB API框架(3) 内核数据库

    选择数据库 SQLite SQLite 是一个软件库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.SQLite 是在世界上最广泛部署的 SQL 数据库引擎. SQL Serv ...

  • ASP.NET Web API 2 中的属性路由

    WEB前端开发社区 昨天路由是 Web API 将 URI 与操作匹配的方式. Web API 2 支持一种称为属性路由的新型路由. 顾名思义,属性路由使用属性来定义路由. 属性路由使您能够对 Web ...

  • 分享一般.net core的web项目发布到服务器环境的处理步骤(来自本人实践笔记)

    <步骤1:发布> <步骤2:确保已打开iis web相关功能>[注]如果未打开在按如下操作.Win7/win10通过打开或关闭windows功能.Windows2012等服务器 ...