我们有一个HttpSys侦听器,该侦听器应接受NTLM,协商或JWT身份验证。
问题在于HttpSys既拒绝了预检消息又拒绝了带有Bearer令牌(JWT)的消息
我们的监听器是这样构建的
_host = new WebHostBuilder()
.UseHttpSys(options =>
{
options.Authentication.Schemes = AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;
options.Authentication.AllowAnonymous = false;
})
.UseUrls($"http://+:{PortNo}/")
.UseUnityServiceProvider(IocContainer)
.ConfigureServices(services => { services.AddSingleton(_startUpConfig); })
.UseStartup<StartUp>()
.Build();
我们向服务添加了CORS和身份验证:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("AllowAll", builder =>
{
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials().WithOrigins("*");
}));
services.AddAuthentication(o =>
{
o.DefaultAuthenticateScheme = HttpSysDefaults.AuthenticationScheme;
o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o =>
{
o.Events = new JwtBearerEvents { OnTokenValidated = context => AuthMiddleWare.VerifyJwt(context, _jwtPublicKey) };
});
我们在Chrome中运行一个角度应用程序,但该应用程序被以下错误消息拒绝 “对预检请求的响应未通过访问控制检查:所请求的资源上没有'Access-Control-Allow-Origin'标头。”
任何承载令牌消息也被拒绝。调试显示,我们从未验证JWT承载的代码(AuthMiddleWare.VerifyJwt)
我的猜测是HttpSys拒绝任何不携带Ntlm或Negotiate令牌的消息。只有我不知道该如何解决
在.net Framework中,我们使用AuthenticationSchemeSelectorDelegate运行以下代码,该代码允许OPTIONS消息和带有Bearer令牌的消息通过HttpSys侦听器
public AuthenticationSchemes EvaluateAuthentication(HttpListenerRequest request)
{
if (request.HttpMethod == "OPTIONS")
{
return AuthenticationSchemes.Anonymous;
}
if (request.Headers["Authorization"] != null && request.Headers["Authorization"].Contains("Bearer "))
{
return AuthenticationSchemes.Anonymous;
}
return AuthenticationSchemes.IntegratedWindowsAuthentication;
}
答案 0 :(得分:0)
我们现在正在工作。基本上,问题是Asp Net Core不支持所有三种身份验证方法。
所以诀窍是在管道中实现我们自己的身份验证。
也请参见以下github问题: https://github.com/aspnet/AspNetCore/issues/13135