.Net Core 2.0中的Windows和匿名身份validation

我正在尝试在.Net Core 2.0空Web应用程序中混合使用Windows匿名身份validation。 我想避免[Authorize]属性,因为我不想使用Mvc或控制器。

我的设置如下:

  1. 我创建了一个空的.Net Core 2.0 Web应用程序

  2. 我去项目属性 – >调试 – >选中“启用Windows身份validation”并禁用“启用匿名身份validation”。 现在“windowsAuthentication”:true和“anonymousAuthentication”:false出现在我的“IIS”下的launchSettings.json中。

  3. 在Startup.cs中,我在ConfigureServices中添加了services.AddAuthentication(Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme); 如https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x#windows-authentication-httpsys–iisintegration中所述

  4. 我添加了一个简单的Console.WriteLine(context.User.Identity.Name); 看到它在app.Run内部工作,并且……一切正常!

但是……一旦我在launchSettings.json中将“anonymousAuthentication”设置为true,它就会停止工作,我无法弄清楚我可以做些什么来使Windows身份validation与它一起工作。 Context.User.Identity.IsAuthenticated始终为false。 正如您所看到的,我的配置非常简单,我需要它保持这种状态。 我想在某些动态路由上启用/禁用Windows身份validation,因此使用具有[Authorize]属性的控制器不是一个选项。

我想要实现的是一个简单的应用程序,其中url“/ authenticated”将使用context.User.Identity.Name的值进行回复,并且url“/ public”将回复类似“这是一个公共页面”的内容!”。 类似于ASP.NET Core中特定路由上的NTLM身份validation,但没有[Authorize]属性和控制器。 资源非常稀缺……任何人都知道我可能会缺少什么? 谢谢!

匿名优先。 当您收到对应用程序的受限制部分的匿名请求时,您需要调用httpContext.ChallengeAsync()。 这将导致客户端在下一个请求上发送凭据。 这是一个测试,这样做 。

经过一段时间浪费在这个话题上,Tratcher的回答救了我。 对于一个非常简单的场景(匿名控制器+ Windows身份validation在其余部分受到限制),这里是一个快速入门(中间件):

 public class NtlmAndAnonymousSetupMiddleware { private readonly RequestDelegate next; public NtlmAndAnonymousSetupMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { if (context.User.Identity.IsAuthenticated || context.Request.Path.ToString().StartsWith("/Anonymous")) { await next(context); return; } await context.ChallengeAsync("Windows"); } } 

我刚刚在Startup.Configure方法的开头插入了这个:

 app.UseMiddleware();