我对ASP.NET Core 2.0应用程序有类似的情况(除了单个控制器之外在整个应用程序中使用Windows身份验证),Daboul的解释还不够 .
中间件
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.cs中的用法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseMiddleware();
// other code here
}
因此,中间件仅接受对匿名控件的匿名请求,如果未提供Windows身份验证信息,则会提供质询 .
匿名控制器
由于中间件在匿名和需要身份验证之间进行区分,因此它看起来就像任何普通的控制器:
[Route("Anonymous")]
public class AnonymousController : Controller
{
[HttpGet("Echo")]
public string Echo(string data)
{
return data;
}
}
测试##
(全部在Windows机器上完成)
Chrome访问非匿名控制器操作=>正常工作( @User.Identity.Name 和 @Context.User.Identity.Name 返回正确的用户
Chrome匿名操作=>直接投放
Firefox(不直接从OS转移NTLM票证)非匿名=>模态请求user / pass =>如果提供正确,它工作正常
Firefox匿名操作=>直接工作