gpt4 book ai didi

.net - 用于 PUT 和 POST 的 Angular4 ASP.NET Core 1.2 Windows 身份验证 CORS 给出 401

转载 作者:太空狗 更新时间:2023-10-29 17:17:11 27 4
gpt4 key购买 nike

我的 IDE 是 Visual Studio 2017。我有一个 Angular4 客户端与 Core 中的 WebAPI 后端通信,并且 CORS 正在按照 PUT 和 POST 方法的配置工作。 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');
}

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();
});
});

Startup.cs 配置服务

app.UseCors("AllowAll");

项目中的 IIS ApplicationHost.Config

<anonymousAuthentication enabled="false" userName="" />
<basicAuthentication enabled="false" />
<clientCertificateMappingAuthentication enabled="false" />
<digestAuthentication enabled="false" />
<iisClientCertificateMappingAuthentication enabled="false"></iisClientCertificateMappingAuthentication>
<windowsAuthentication enabled="true" >
<providers>
<add value="Negotiate" />
</providers>
</windowsAuthentication>

<customHeaders>
<clear />
<add name="X-Powered-By" value="ASP.NET" />
<add name="Access-Control-Allow-Origin" value="http://localhost:5000"/>
<add name="Access-Control-Allow-Headers" value="Accept, Origin, Content-
Type"/>
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE,
OPTIONS"/>
<add name="Access-Control-Allow-Credentials" value="true"/>
</customHeaders>

对 GET 的响应

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: **Kestrel**
X-SourceFiles: =?UTF-8?B?QzpcZGV2cHJvamVjdHNcVFJXRC5IeWRyb21hcnRBZG1pblxKVF9BZGRUYWdNYW5hZ2VtZW50XFRSV0QuSHlkcm9NYXJ0LkFwcFxhcGlcdGFncw==?=
Persistent-Auth: true
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: http://localhost:5000
Access-Control-Allow-Headers: Accept, Origin, Content-Type
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Credentials: true
Date: Fri, 14 Jul 2017 17:03:43 GMT

对 POST 的响应

HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/10.0
X-SourceFiles: =?UTF-8?B?QzpcZGV2cHJvamVjdHNcVFJXRC5IeWRyb21hcnRBZG1pblxKVF9BZGRUYWdNYW5hZ2VtZW50XFRSV0QuSHlkcm9NYXJ0LkFwcFxhcGlcdGFncw==?=
WWW-Authenticate: Negotiate
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: http://localhost:5000
Access-Control-Allow-Headers: Accept, Origin, Content-Type
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Credentials: true
Date: Fri, 14 Jul 2017 17:05:11 GMT
Content-Length: 6095

所以最大的问题是,我错过了什么?

最佳答案

这是对我有用的...

首先,将 CORS 策略添加到 ConfigureServices()Startup.cs

services.AddCors(o => o.AddPolicy("CORSPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
}));

并在 Configure() 中使用方法

app.UseCors("CORSPolicy");

接下来,要么添加 Authorize属性到您的 Controller 或全局添加它们。我和全局一起去了。为此,请在 services.AddCors() 之后添加以下内容ConfigureServices() 中的上述方法方法(你也可以在该谓词中包含其他内容)

            services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});

然后,我添加了这个小块(它让一切都对我“正常工作”)。基本上,它允许预检请求在不进行身份验证的情况下通过 IIS。

services.AddAuthentication(IISDefaults.AuthenticationScheme);

我认为您必须将以下内容添加到您的 using也是

using Microsoft.AspNetCore.Server.IISIntegration;

您还应该告诉应用程序使用身份验证。在 Configure() 中执行此操作下面的方法app.UseCors("CORSPolicy")

app.UseAuthentication();

最后,确保你有 anonymousAuthenticationwindowsAuthentication设置为 true在你的applicationhost.config文件。如果您不知道该文件是什么,它会为应用程序配置 IIS 设置。您可以在隐藏 .vs 中找到它config 中项目根目录中的文件夹文件夹。

<authentication>
<anonymousAuthentication enabled="true" userName="" />
<basicAuthentication enabled="false" />
<clientCertificateMappingAuthentication enabled="false" />
<digestAuthentication enabled="false" />
<iisClientCertificateMappingAuthentication enabled="false"></iisClientCertificateMappingAuthentication>
<windowsAuthentication enabled="true">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>

我不知道是不是每个人都是这样,但我有两个 <authentication></authentication>我的部分 applicationhost.config文件。为了安全起见,我同时更改了两者,并没有尝试更改一个而不更改另一个。


**

长篇小说;

**

步骤 1)

public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("CORSPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
}));

services.AddAuthentication(IISDefaults.AuthenticationScheme);

services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseCors("CORSPolicy");

app.UseAuthentication();

app.UseMvc();
}

第 2 步)在 applicationhost.config 您可能必须在文件的两个位置执行此操作

<authentication>
<anonymousAuthentication enabled="true" />
<windowsAuthentication enabled="true" />
</authentication>

关于.net - 用于 PUT 和 POST 的 Angular4 ASP.NET Core 1.2 Windows 身份验证 CORS 给出 401,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45108307/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com