AspNetCore拒绝预检消息

时间:2019-08-14 07:02:27

标签: c# authentication asp.net-core jwt ntlm

我们有一个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;
    }

1 个答案:

答案 0 :(得分:0)

我们现在正在工作。基本上,问题是Asp Net Core不支持所有三种身份验证方法。

所以诀窍是在管道中实现我们自己的身份验证。

也请参见以下github问题: https://github.com/aspnet/AspNetCore/issues/13135