我完全坚持为我的一个使用Aurelia作为客户端的.NET Core应用程序实现Windows身份验证。
Aurelia应用程序托管在端口:9000 上,.NET WebAPI托管在端口:9001 上。
这个想法是在应用程序发布后从我的.NET应用程序提供静态页面但现在正在开发中我使用 port:9000 ,因为Aurelia提供了BrowserSync。
当我使用端口:9000 时,一切都很好,花花公子,我发布或获取没有任何问题。
如果我切换到端口:9001 我仍然可以获得但不能发布。发布结果为401 Unauthorized
。
如果我们查看端口:9000 请求的标头..
获取(成功):
发表(失败):
您可以看到由于某些原因,帖子中缺少多个标头,最重要的是身份验证Cookie ..
基Repo.js
import {inject} from 'aurelia-framework';
import {HttpClient, json} from 'aurelia-fetch-client';
import {AppSettings} from '../infrastructure/app-settings';
@inject(HttpClient, AppSettings)
export class BaseRepo {
constructor(http, appSettings) {
http.configure(config => {
config
.withDefaults({
credentials: 'include',
headers: {
'Accept': 'application/json'
}
})
.withInterceptor({
request(request) {
console.log(`Requesting ${request.method} ${request.url}`);
return request;
},
response(response) {
console.log(`Received ${response.status} ${response.url}`);
return response;
}
})
});
this.http = http;
this.baseUrl = appSettings.api;
}
get(url) {
console.log('BaseRepo(get): ' + url);
return this.http.fetch(this.baseUrl + url)
.then(response => { return response.json(); })
.then(data => { return data; });
}
post(url, data) {
console.log('BaseRepo(post): ' + url, data);
return this.http.fetch(this.baseUrl + url, {
method: 'post',
body: json(data)
})
.then(response => response.json())
.then(data => { return data; });
}
}
使用BrowserSync端口时,为什么GET正常工作但没有POST?
修改1
发布(成功)端口:9001:
编辑2 控制台消息发布错误:
选项
http://localhost:9001/api/MYURLS 401 (Unauthorized)
无法加载Fetch API http://localhost:9001/api/MYURLS。 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许来源“http://localhost:9000” 访问。响应具有HTTP状态代码401.如果是不透明的响应 满足您的需求,将请求的模式设置为'no-cors'来获取 CORS禁用的资源。
编辑3
Startup.cs
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
env.ConfigureNLog("nlog.config");
}
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
services.AddMemoryCache();
services.AddMvc();
services.InjectWebServices();
services.AddOptions();
//call this in case you need aspnet-user-authtype/aspnet-user-identity
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IConfiguration>(Configuration);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCors("CorsPolicy");
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseMvc();
app.UseDefaultFiles();
app.UseStaticFiles();
//add NLog to ASP.NET Core
loggerFactory.AddNLog();
//add NLog.Web
app.AddNLogWeb();
}
}
答案 0 :(得分:1)
您需要在ASP.NET Core项目中启用CORS。有关如何在此处执行此操作的信息:https://docs.microsoft.com/en-us/aspnet/core/security/cors。
您需要在AddCors
中致电ConfigureServices
:
services.AddCors();
然后UseCors
中的Configure
:
// Shows UseCors with CorsPolicyBuilder.
app.UseCors(builder => builder.WithOrigins("http://example.com"));
当您使用端口9000时,您与API的来源不同,但对于9001,您使用相同的来源,因此CORS将不适用。
OPTIONS请求被称为&#34;预检&#34;。有关这些内容的更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests。
答案 1 :(得分:1)
我已启用&#34;启用匿名身份验证&#34;在项目属性和瞧... ...
之前我只有#34;启用Windows身份验证&#34;启用,现在两个端口都可以工作!
当部署应用程序时,无论如何都不会启用它,因为那时我将使用真正的IIS。
更新1
升级到.net core 2.0后,我无法同时启用Windows身份验证和匿名身份验证。 经过一些研究,我发现你必须补充:
services.AddAuthentication(IISDefaults.AuthenticationScheme);
在您的startup.cs中以使其正常工作。
更新2
您需要 Microsoft.AspNetCore.Authentication 包作为身份验证构建器。