匿名身份验证和Windows身份验证实际上可以一起使用。但是你必须在你自己的代码中做一些工作。 您必须在IIS中启用这两种身份验证类型,这将使每个请求在默认情况下都被视为匿名请求。然后,在请求管道中注册一个中间件,该中间件在被调用的控制器和操作中查找[Authorize]属性。如果您找到了Windows登录信息,您就会要求客户端提供Windows登录信息。只需确保在请求管道中的app.UseRouting();之后、app.UseAuthentication/app.UseAuthorization之前注册中间件即可。 这是我在中间件中使用的代码,我希望它能对某些人有所帮助:
    1. namespace ExamKing.WebApp.Admin
    2. {
    3. public class SingleSignOnMiddleware
    4. {
    5. private readonly RequestDelegate next;
    6. public SingleSignOnMiddleware(RequestDelegate next)
    7. {
    8. this.next = next;
    9. }
    10. public async Task Invoke(HttpContext context)
    11. {
    12. if (!context.User.Identity.IsAuthenticated)
    13. {
    14. Endpoint endpoint = context.GetEndpoint();
    15. if(endpoint != null)
    16. {
    17. foreach (var meta in context.GetEndpoint().Metadata)
    18. {
    19. if (meta is AuthorizeAttribute)
    20. {
    21. await context.ChallengeAsync("Windows");
    22. return;
    23. }
    24. }
    25. }
    26. }
    27. await next.Invoke(context);
    28. }
    29. }
    30. // Extension method used to add the middleware to the HTTP request pipeline.
    31. public static class SingleSignOnMiddlewareExtensions
    32. {
    33. public static IApplicationBuilder UseSingleSignOnMiddleware(this IApplicationBuilder builder)
    34. {
    35. return builder.UseMiddleware<SingleSignOnMiddleware>();
    36. }
    37. }
    38. }
    如您所见,我使用的是context.GetEndpoint().Metadata。这是各种元数据元素的集合,包括装饰被调用的控制器和操作的属性。所以你可以在这里搜索一个AuthorizeAttribute类型的对象。 此方法实现了在所有用[Authorize]修饰的控制器和操作上强制执行Windows身份验证,但允许在没有此属性的控制器和操作上执行匿名请求。这种方法还允许匿名访问wwwroot中的文件。