如何在ASP.NET Core中执行中间件
问题描述:
我将Auth0添加到简单项目并尝试了解中间件如何工作。如何在ASP.NET Core中执行中间件
在我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核心中间件的理念在我们的例子中,如果有一个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一些静态文件。
答
管道中的每一个中间件都可以选择调用下一个中间件。你得到静态文件而不是命中MVC控制器的原因是因为静态文件中间件发现了所请求的文件,并选择不调用链中的下一个中间件。它只是将该文件作为响应返回。
AutomaticAuthenticate
身份验证中间件始终表示“检查传入的请求,如果您发现某些您感兴趣的内容,请从它创建一个ClaimsPrincipal。”在这种情况下,在将请求传递到下一个中间件之前,Cookie身份验证会在登录用户登录Cookie位于请求中时自动为登录用户创建主体。
OpenId Connect中间件实际上执行,但它没有做任何事情,因为它不会在请求中发现任何有趣的内容,即使它有AutomaticAuthenticate = true
。它正在查找其回叫路径的请求,默认情况下,该回叫路径在constructor中设置为CallbackPath = new PathString("/signin-oidc");
。
这两个身份验证中间件都是这样安装的,以便Cookie中间件始终运行,但OpenId Connect只在请求时(例如通过从您的MVC控制器返回ChallengeResult)重定向到身份提供程序。
您对“自动挑战”属性有任何评论吗? UseCookieAuthentication中间件中的AutomaticChallenge设置为true是什么效果?我的发现告诉我,如果管道中有UseOpenIdConnectAuthentication,则不应将此属性设置为true,这是由于默认情况下OIDC中间件的AutomaticChallenge设置为true。 https://github.com/aspnet/Announcements/issues/210 –
AutomaticChallenge简单地定义了中间件是否应该像在请求未经授权时直接请求发出挑战一样。由于只有靠近未经授权的结果(即稍后注册的那个)运行,因此拥有其中两个是没有意义的。这实际上取决于你的具体用例,哪个中间件应该是默认的。 *通常情况下* OIDC是默认的,因为我们希望用户重定向到登录提供程序。 – juunas