如何解决.net core 3.1 中被 CORS 阻止的 Httppost 和 httpput
当我通过 Angular 10 前端向 API .net core 3.1 制作 httppost 和 httput(httpget 可以)时遇到问题,控制台应用程序中的错误是著名的: 从源“http://localhost:4200”访问“http://localhost:23645/api/Toolbar/Search”的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:否请求的资源上存在“Access-Control-Allow-Origin”标头。
这是我前台请求的代码:
constructor(private Http: HttpClient) {
this.header = new HttpHeaders(
{
'content-type': 'application/json'
}
)
searchToolbar(search: string): Observable<ToolbarSearchResultItem[]> {
return this.Http.post(this.url + '/myController/Search',{ "search": search },{ headers: this.header,withCredentials:true}).pipe(tap((response: myTyoe[]) => {
return response;
}));
这是我在 Startup.cs 中的代码:
public void ConfigureServices(IServiceCollection services)
{
log.Info("ConfigureServices");
try
{
IConfigurationRoot configurationRoot = builder.Build();
services.AddCors(opt => opt.AddPolicy("CorsPolicy",c =>
{
c.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
}));
services.AddAuthorization(options =>
{
options.AddPolicy("AllUsers",policy => policy.RequireAuthenticatedUser());
});
services.AddControllers();
services.AddMvc();
}
catch (Exception ex)
{
log.Error("Error in ConfigureServices" + ex.Message + ex.StackTrace);
}
public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
{
try
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseCors("CorsPolicy");
app.UseAuthorization();
在launchSettings.json中我设置了这个:
"iisSettings": {
"windowsAuthentication": true,"anonymousAuthentication": false,"iisExpress": {
"applicationUrl": "http://localhost:23645","sslPort": 0
}
在 applicationhost.config 中:
<windowsAuthentication enabled="true">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
这是我的控制器:
[HttpPost]
[Route("Search")]
[EnableCors("CorsPolicy")]
public IList<ToolbarSearchResultItem> Search(ToolbarSearch search)
{
//my code
}
这是控制台中的详细消息:请求 URL:http://localhost:23645/api/Toolbar/Search 请求方法:OPTIONS 状态代码:401 未经授权 远程地址:[::1]:23645 推荐人政策:strict-origin-when-cross-origin 缓存控制:私有 内容长度:6284 内容类型:文本/html;字符集=utf-8 日期:2021 年 3 月 2 日星期二 15:52:05 GMT 服务器:Microsoft-IIS/10.0 WWW-Authenticate:协商 WWW-身份验证:NTLM X-Powered-By: ASP.NET 接受:/ 接受编码:gzip、deflate、br 接受语言:fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7 访问控制请求头:内容类型 访问控制请求方法:POST 连接:保持连接 主机:本地主机:23645 来源:http://localhost:4200 引用者:http://localhost:4200/ Sec-Fetch-Dest:空 Sec-Fetch-Mode:cors Sec-Fetch-Site:同站
这是我的 web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\MYEXE.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
</location>
</configuration>
我认为这不是真正的 CORS 块问题,而是配置问题或其他问题,与此问题非常相似:Trouble with CORS Policy and .NET Core 3.1 但我使用了分析器,但没有 SQL 问题
解决方法
从您的启动 Cors 配置中删除
.AllowCredentials();
并从控制器操作中删除
[EnableCors("CorsPolicy")]
但是您仍然有状态代码:401。它与 Cors 无关。这只是关于授权。只需注释所有授权代码即可测试 CORS。在此之后,您可以从授权开始。
,从源 'http://localhost:4200' 访问 XMLHttpRequest at 'http://localhost:23645/api/Toolbar/Search' 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。
请注意 CORS preflight request(使用 HTTP OPTIONS
方法)用于检查 CORS 协议是否被理解以及服务器知道使用特定的方法和标头。并且 HTTP OPTIONS
请求始终是匿名的,您启用了 Windows 身份验证并禁用了匿名访问,这将导致服务器无法正确响应预检请求。 >
要在本地运行您的应用以使用 CORS 进行测试,要解决此问题,您可以尝试启用匿名身份验证以允许匿名访问。
此外,如果您要将应用托管在 IIS 服务器上,要解决此问题,您可以安装 IIS CORS module 并为应用配置 CORS。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。