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,无论是否进入有效路径。
我在 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,无论是否进入有效路径。