ASP.Net Core 2.0混合身份validationJWT和Windows身份validation不接受凭据

我在asp.net core 2.0中创建了API,我正在使用混合模式身份validation。 对于某些控制器JWT和一些使用Windows身份validation。

我对使用JWT授权的控制器没有任何问题。 但对于我想要使用Windows身份validation的控制器,我无限期地提示使用chrome的用户名和密码对话框。

这里是我的示例控制器代码,我想使用Windows身份validation而不是JWT。

[Route("api/[controller]")] [Authorize(AuthenticationSchemes = "Windows")] public class TestController : Controller { [HttpPost("processUpload")] public async Task ProcessUploadAsync(UploadFileModel uploadFileModel) { } } 

我的配置服务代码

 public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(options => { options.DefaultAuthenticateScheme = IISDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer("Bearer", options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false, ValidateIssuer = false, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("blahblahKey")), ValidateLifetime = true, //validate the expiration and not before values in the token ClockSkew = TimeSpan.FromMinutes(5) //5 minute tolerance for the expiration date }; }); // let only my api users to be able to call services.AddAuthorization(auth => { auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder() .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​) .RequireClaim(ClaimTypes.Name, "MyApiUser").Build()); }); services.AddMvc(); } 

我的配置方法。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseCors("CorsPolicy"); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseAuthentication(); //needs to be up in the pipeline, before MVC app.UseMvc(); } 

感谢您的建议和帮助。

更新:直到现在我一直在调试我的代码在chrome上。 但是当我使用IE 11时,上面的代码运行没有任何问题。

这可能是预检问题的铬的CORS问题吗?

谢谢

您需要确保在尝试使用Windows身份validation时不要设置Authorization: Bearer HTTP标头。 这里的关键点是“Windows Auth”实际上是如何工作的。 让我们看看它如何与浏览器一起工作。

我们称之为“正常流程”:

  1. 您可以在浏览器中导航到http://example.com/api/resource ;
  2. 您的浏览器现在向http://example.com/api/resource发送HTTP GET请求,而没有任何Authorization HTTP标头(匿名请求);
  3. Web服务器(或WebAPI自己)接收请求,发现没有Authorization标头并使用WWW-Authenticate: NTLM,Negotiate响应401 Not Authorized状态代码WWW-Authenticate: NTLM,Negotiate HTTP Header设置( “离开,没有匿名访问。仅限欢迎’NTLM’或’谈判’家伙!“ );
  4. 浏览器收到401响应,发现该请求是匿名的,查找WWW-Authenticate标头并立即重复请求,现在使用Authorization: NTLM HTTP标头( “好的, Authorization: NTLM ,先生。网络服务器!这是我的NTLM令牌。“ );
  5. 服务器收到第二个请求,在Authorization标头中找到NTLM令牌,validation它并执行请求( “好的,你可以通过。这是你的资源。” )。

当你初步将Authorization标头设置为某个值时,事情会有所不同:

  1. 您的JS需要使用JWT授权http://example.com/api/resource ;
  2. 您的浏览器现在通过Authorization: Bearer HTTP标头向http://example.com/api/resource发送HTTP GET请求;
  3. Web服务器(或WebAPI自己)接收请求,发现有“承载”认证方案的Authorization标头,并再次使用WWW-Authenticate: NTLM,Negotiate响应401 Not Authorized状态代码WWW-Authenticate: NTLM,Negotiate HTTP Header设置( “走开” ,我们不知道这个’持票人’是谁,但我们不喜欢他们。只欢迎’NTLM’或’谈判’的人!“ );
  4. 浏览器收到401响应,发现该请求获得授权,并确定此令牌是坏的。 但是,当您实际设置Authorization标头时,这意味着您实际上一些凭据。 因此,它会通过此对话框询问您的凭据。

谢谢@ vasily.sib。 你是对的我的JWTInterceptor正在向标题中添加JWTToken。 当我评论它并测试它起作用。 感谢大家为我节省了2天的痛苦,找出问题所在。 你是冠军。