OWIN AuthenticationMiddleware每次请求调用两次

时间:2017-12-28 14:05:04

标签: .net owin middleware

使用owin cookie身份验证中间件时遇到问题:

当我向我的Startup.Configuration添加cookie身份验证中间件时,我的所有中间件都会在每个请求中调用两次,这是我的代码:

public void Configuration(IAppBuilder app)
    {
        app.Use((context, next) =>
        {
            // this code will be executed twice per http request
            return next();
        });

        // my cookie middleware
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
            AuthenticationMode = AuthenticationMode.Active
        });
    }

然后我自己编写了一个中间件,它从AuthenticationMiddleware继承了空工具,并且工作方式相同 - 我的所有中间件都会在每次请求时调用两次。

当我调试owin AuthenticationMiddleware源代码时:

 public override async Task Invoke(IOwinContext context)
    {
        AuthenticationHandler<TOptions> handler = CreateHandler();
        await handler.Initialize(Options, context);
        if (!await handler.InvokeAsync())
        {
            await Next.Invoke(context);
        }
        await handler.TeardownAsync();
    }

我发现await Next.Invoke(context);会导致我的所有中间件再次被调用。

但是当我使用其他中间件(StaticFiles中间件,Webapi中间件)时,一切正常。

我是否错过了有关OWIN或AuthenticationMiddleware的内容?

为什么每个请求会调用两次中间件?它是按设计的吗?

1 个答案:

答案 0 :(得分:0)

如果您的所有应用程序都在Owin中,那么您应该将此中间件添加到管道的末尾,并且您的问题应该消失了!

app.Run(async context =>
{
    context.Response.StatusCode = 404;
    await context.Response.WriteAsync("404");
});

这将使请求保留在owin上下文中,并且它不会获得默认的IIS模块。出于某种原因(我不知道是什么!)如果请求从Owin发出并且没有模块处理它,那么owin请求会运行两次!!