【问题标题】:Intercept 401 error in ASP.net Core 2.0 pipeline在 ASP.net Core 2.0 管道中拦截 401 错误
【发布时间】:2018-09-07 10:20:08
【问题描述】:

在我的 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!");
    }
});

关于如何实施拦截有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    先使用这个中间件:

    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");
        }              
    });
    

    Not found 不会有任何异常。上下文响应的 StatusCode 默认值为 404。如果没有中间件修改响应,将返回 404 给客户端。在这种情况下,我们设置了一个中间件,它允许其他中间件通过等待 next.Invoke().. 现在来处理请求url”消息。

    【讨论】:

    • 做到了!显然是从404修改为401。我想这是我唯一没有想到的组合;让之后的一切都等待,然后检查之后的响应。
    猜你喜欢
    • 2022-09-23
    • 2018-04-25
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多