带有web.config授权元素的OWIN Cookie中间件

时间:2016-04-08 13:23:29

标签: asp.net cookies owin openid-connect katana

我一直在与OWIN cookie中间件(3.0.1)的一个奇怪问题挣扎了好几天。

我用最小的代码示例重新创建了这个问题。首先创建一个空的ASP.NET Web应用程序项目(VS.NET 2015)。和OWIN nuget包等......以及一个基本的Startup类:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.Use(async (context, next) =>
        {
            // context.Response.StatusCode = 200 here
            Debug.WriteLine("1. ==> Request - Before Cookie Auth");
            await next();
            // context.Response.StatusCode = 401 here
            Debug.WriteLine("4. <== Response - After Cookie Auth");
        });

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        // by adding this element to web.config, the next middle is no longer used, the request ends with 401.2
        // <authorization>
        //    <deny users="?" />
        // </authorization>

        app.Use(async (context, next) =>
        {
            // I thought this middleware would be hit so it could deal with 401 - issue challenge
            // e.g. app.UseOpenIdConnectAuthentication etc...
            Debug.WriteLine("2. ==> After Cookie Auth, Never Hit!! if web.config has <authorization>< deny users = \"?\" /> ");
            await next();
            Debug.WriteLine("3. <== Never hit");
        });
    }
}

代码按预期工作,直到我将follow元素添加到web.config

<authorization>
  <deny users="?" />
</authorization>

我的第二个OWIN中间件现在不再被调用。在这个例子中,它的简单日志语句,但在一个更大的项目中,它的app.UseOpenIdConnectAuthentication。

我的理解是401状态将由其他身份验证中间件处理,并反过来创建质询响应。

但是在调用cookie中间件之后没有任何内容。响应只返回401.2

本地IIS和IIS Express都会发生这种情况。

1 个答案:

答案 0 :(得分:2)

在app.UseCookieAuthentication之后添加以下代码:

app.UseStageMarker(PipelineStage.Authenticate);

这将指示Owin在集成管道中运行。