UseWindowsAzureActiveDirectoryBearerAuthentication 中间件不会在不存在的路由上触发:app returns 404 而不是 401

UseWindowsAzureActiveDirectoryBearerAuthentication middleware is not triggered on routes that don't exists: app returns 404 instead of 401

我在 Web api 项目中使用 WindowsAzureActiveDirectoryBearerAuthenticationOptions 中间件,我的 Startup.cs 的重要部分如下所示:

public static void ConfigureApp(IAppBuilder appBuilder)
{    
   HttpConfiguration config = new HttpConfiguration();

   config.MapHttpAttributeRoutes();

   appBuilder.UseWindowsAzureActiveDirectoryBearerAuthentication(
        new WindowsAzureActiveDirectoryBearerAuthenticationOptions
        {
               Tenant = "xx-xx-xx",
               TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
                {
                    ValidAudience = "yy-yy-yy",
                    ValidateAudience = true
                }
         });

   config.Filters.Add(new AadAuthorizeAttribute());
   appBuilder.UseWebApi(config);
}

问题是,如果我尝试访问 http://localhost/api/404route(不存在),我应该得到 401 时得到 404(因为来自浏览器的请求没有任何承载令牌等. 并且未经身份验证)。如果我去一条存在的路线,我会按预期得到 401。我相信这是因为 AadAuthorizeAttribute 触发了中间件执行,当 webapi 找不到 controller/action 时不会发生这种情况。

即使在使用这个简单的中间件时路由不存在(最好不想自己编写),我如何触发任何请求的身份验证?

身份验证中间件始终是 运行。但它不会抛出 401,这不是它的工作。它只检查身份并在找到任何身份时将其添加到请求中。

你需要的是这样的:

app.Use(async (ctx, next) =>
{
    if (ctx.Authentication.User.Identity.IsAuthenticated == false)
    {
        ctx.Response.StatusCode = 401;
        return;
    }
    await next();
});

将此放在您的身份验证中间件之后,它会针对任何未经身份验证的请求发回 401,无论是否进入有效路径。