我一直在与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都会发生这种情况。
答案 0 :(得分:2)
在app.UseCookieAuthentication之后添加以下代码:
app.UseStageMarker(PipelineStage.Authenticate);
这将指示Owin在集成管道中运行。