匿名身份验证和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中的文件。