ASP.net Core 2.0管道中的拦截401错误

时间:2018-03-28 16:13:16

标签: c# asp.net-mvc asp.net-core identityserver4

在我的ASP.net Core 2.0管道中,我有以下两个配置条目:

app.UseIdentityServer();
app.UseMvc(...);

我不确定哪些会产生401响应,所以我添加了一些自定义中间件,看看是否有可能在不同阶段拦截它们:

app.Use(async (http, next) =>
{
    if (http.Response.StatusCode == StatusCodes.Status401Unauthorized))
    {
        Console.WriteLine("intercept!");
    }
});

如果放在UseIdentityServer()之后,此代码将会触发,但不会与401一起触发,如果在401场景中放置UseMvc()之后,则不会触发 。也就是说,UseMvc()似乎正在结束管道。

因为在一个案例中没有发生错误,而在另一个案例中它从未到达,我怎么能拦截这些401? (并可能重写它们)

我还尝试了一个关于管道延续的try-catch,很早就放在了管道中,但这也没有解决:

app.Use(async (http, next) =>
{
    try
    {
        await next();
    }
    catch (Exception ex)
    {
        Console.WriteLine("intercept!");
    }
});

关于我如何设置拦截的任何想法?

1 个答案:

答案 0 :(得分:2)

在其他任何事情之前使用此中间件:

app.Use(async (context, next) =>
{
    await next.Invoke();

    if(context.Response.StatusCode == StatusCodes.Status404NotFound)
    {
        await context.Response.WriteAsync("You seem to have mistyped the url");
    }              
});

找不到任何例外。上下文响应的StatusCode的默认值是404.如果没有中间件修改响应,则404将返回给客户端。在这种情况下,我们已经设置了一个中间件,允许其他中间件首先等待next.Invoke()..现在,在返回时它检查StatusCode是否仍然是404并写入“你似乎错误输入了网址“消息。