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