我将Auth0添加到简单项目并尝试了解中间件的工作原理。
在我的Startup.cs中,我有这段代码
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IOptions<AuthSettings> auth0Settings)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
// Add the cookie middleware
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
// Add the OIDC middleware
var options = new OpenIdConnectOptions("Auth0")
{
// here there are some configurations
// .....................
};
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("name");
options.Scope.Add("email");
options.Scope.Add("picture");
app.UseOpenIdConnectAuthentication(options);
app.UseMvc(routeBuilder =>
{
routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}");
});
}
如果我在我们的示例中正确理解了ASP.NET Core中的中间件的想法,如果存在cookie并且可以通过它进行身份验证
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
OpenId中间件不会被执行。
app.UseOpenIdConnectAuthentication(options);
有人可以解释我OpenId中间件如何知道它不应该被执行?
在底部我们有
app.UseMvc(routeBuilder =>
{
routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}");
});
它如何知道它应该总是被执行但是如果我们请求一些静态文件,我们不使用mvc。
答案 0 :(得分:5)
管道中的每个中间件都可以选择调用下一个中间件。您获取静态文件而不是命中MVC控制器的原因是因为静态文件中间件找到了请求的文件,并选择不调用链中的下一个中间件。它只是将文件作为响应返回。
身份验证中间件中的 AutomaticAuthenticate
始终意味着“检查传入的请求。如果您发现了您感兴趣的内容,请从中创建一个ClaimsPrincipal。”在这种情况下,在将请求传递给下一个中间件之前,cookie身份验证会在登录cookie位于请求中时自动为登录用户创建主体。
OpenId Connect中间件实际上是在执行,但它没有做任何事情,因为即使它有AutomaticAuthenticate = true
,它也不会在请求中找到任何有趣的东西。它正在寻找对其回调路径的请求,默认情况下在constructor中设置为CallbackPath = new PathString("/signin-oidc");
。
这两个身份验证中间件是这样设置的,因此cookie中间件始终运行,但OpenId Connect仅在请求时重定向到身份提供程序(例如,通过从MVC控制器返回ChallengeResult)。