我在谷歌和Stack溢出搜索了很多,为我的问题找到了解决方案,但没有任何效果.
这是我的问题:
我使用IIS 7和一个名为WebDEV的特殊编程环境,它不允许直接操作OPTIONSHTTP方法.因此,所有使用代码建议某种服务器端请求处理的解决方案都是不可行的.
我必须使用Window身份验证并禁用匿名访问
我有一个页面使用CORS POST到此服务器.正如此POST应该具有的那样Content-type: Octet-stream,浏览器会发出预检.
当我启用匿名访问时,一切正常(CORS已配置好)
当我禁用匿名访问时,服务器会回复HTTP 401对预检请求的未授权响应,因为它不包含凭据信息.
我试图为IIS写一个接受这样的OPTIONS请求的模块,但是它没有用(无法将模块正确地添加到IIS)
public class CORSModule : IHttpModule
{
public void Dispose() {
}
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += delegate
{
if (context.Request.HttpMethod == "OPTIONS")
{
var response = context.Response;
response.StatusCode = (int)HttpStatusCode.OK;
}
};
}
}
Run Code Online (Sandbox Code Playgroud)问题是:如何在不启用匿名访问或编写某些服务器端代码的情况下,使用HTTP 200响应预检请求?是否有一个简单的配置或现成的模块供IIS使用?至少,将上述模块安装到IIS 7中的具体步骤是什么?
我的IDE是Visual Studio 2017.我有一个Angular4客户端与Core中的WebAPI后端通信,而CORS正在为PUT和POST方法配置EXCEPT.GET方法在Chrome中使用与PUT和POST方法相同的预检OPTIONS方法,但GET工作正常.
Visual Studio中的IIS Express服务器似乎没有将请求转发到Kestrel服务器.两种方法都适用于Postman,但是当Angular4进行调用时则不行.这是代码:
Angular4 POST
post(api: string, object: any): Observable<any> {
let body = JSON.stringify(object);
let options = new RequestOptions({
headers: this.headers,
withCredentials: true
});
return this.http.post(this.server + api, body, options)
.map((res: Response) => res.json())
.catch((error: any) => Observable.throw(error.json().error) || 'Post server error');
}
Run Code Online (Sandbox Code Playgroud)
Startup.cs配置
services.Configure<IISOptions>(options =>
options.ForwardWindowsAuthentication = true);
services.AddCors(options => {
options.AddPolicy("AllowAll", builder => {
builder.WithOrigins("http://localhost:XXXX")
.WithMethods("GE??T", "POST", "PUT", "DELETE", "OPTIONS")
.WithHeaders("Origin", "X-Requested-With", "Content-Type", "Accept", "Authorization")
.AllowCredentials();
});
});
Run Code Online (Sandbox Code Playgroud)
Startup.cs ConfigureServices
app.UseCors("AllowAll");
Run Code Online (Sandbox Code Playgroud)
Project中的IIS ApplicationHost.Config
<anonymousAuthentication …Run Code Online (Sandbox Code Playgroud) 前言:我知道一般意义上这是如何完成的,我的问题是如何在 Azure 应用服务上最好地设置它
a) 在 Azure 应用服务托管的 Rest 服务(应用程序#1)上的 CORS 配置在哪里完成?是否是通过 C# 代码的传统方式,例如 config.EnableCors(); 或者也可以通过 Azure Portal 魔法来完成?
b) 如果客户端应用程序 (App-#2) 托管在(另一个)Azure 应用服务上,则在哪里可以找到将在 Ajax 调用中发送到 App-#1 的外部 IP 地址?
我有一个.Net Core WebAPI服务,已在项目的属性中启用了CORS(使用下面的代码),我禁用了匿名身份验证并启用了Windows身份验证。POST和PUT端点在启用匿名身份验证的情况下工作,但在禁用匿名身份验证时失败。我懂了
OPTIONS http://localhost:64113/api/ 401 (Unauthorized)
Run Code Online (Sandbox Code Playgroud)
启用CORS的代码
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.WithOrigins("http://localhost:3000")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
Run Code Online (Sandbox Code Playgroud)
角度代码
public XXX(data: any): Observable<Response> {
return this.http.put(this.baseUrl, data,
{ withCredentials: true });
}
Run Code Online (Sandbox Code Playgroud)
有没有人有任何经验?
谢谢
我正在开发一个单页网络应用程序。它具有ASP.NET Core 3后端和Angular 9前端。我在 Visual Studio 中的 IIS Express 上运行后端,网址为http://localhost:59280。前端在 Visual Studio Code 中运行,使用ng servehttp ://localhost:4200。之前我不需要在后端开启 CORS,因为我只在 Chrome 中测试了应用程序,添加--disable-web-security命令行参数就足以关闭同源策略。在实时服务器上不需要 CORS,上述跨域情况仅发生在我的开发机器上。
现在我想在 Firefox 中调试前端,但由于无法关闭 Firefox 的同源策略,所以我必须在后端打开 CORS。不幸的是,它不起作用,因为我使用 Windows 身份验证,并且它会停止默认未经身份验证的CORS 预检请求。如果我可以在没有 Windows 身份验证的情况下处理 HTTP OPTIONS 请求,则可以解决此问题。我认为这可以通过在web.config中添加类似的内容来完成:
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" />
</authentication>
<authorization>
<add accessType="Allow" verbs="OPTIONS" users="*" />
</authorization>
</security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
...但我收到一条错误消息:“此配置节不能在此路径上使用。当该节被锁定在父级别时,就会发生这种情况。” 显然 web.config 与launchSettings.json冲突,后者似乎在 Visual Studio 中的 IIS Express 上运行后端时控制身份验证,使用以下两行:
{
"iisSettings": …Run Code Online (Sandbox Code Playgroud)