【问题标题】:How are middlewares executed in ASP.NET CoreASP.NET Core 中的中间件是如何执行的
【发布时间】:2023-04-07 16:49:01
【问题描述】:

我正在将 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。

【问题讨论】:

    标签: c# asp.net-core middleware


    【解决方案1】:

    管道中的每个中间件都可以选择调用下一个中间件。您获得静态文件而不是访问 MVC 控制器的原因是因为静态文件中间件找到了请求的文件,并选择不调用链中的下一个中间件。它只是将文件作为响应返回。

    身份验证中间件中的AutomaticAuthenticate 始终表示“检查传入请求。如果您发现感兴趣的内容,请从中创建一个 ClaimsPrincipal。”在这种情况下,cookie 身份验证会在登录 cookie 在请求中时自动为登录用户创建一个主体,然后再将请求传递给下一个中间件。

    OpenId Connect 中间件实际执行,但它不做任何事情,因为即使它有AutomaticAuthenticate = true,它也不会在请求中找到任何有趣的东西。它正在寻找对其回调路径的请求,默认情况下在constructor 中设置为CallbackPath = new PathString("/signin-oidc");

    两个身份验证中间件是这样设置的,因此 cookie 中间件始终运行,但 OpenId Connect 仅在请求时重定向到身份提供者(例如,通过从 MVC 控制器返回 ChallengeResult)。

    【讨论】:

    • 您对“AutomaticChallenge”属性有什么意见吗?在 UseCookieAuthentication 中间件中将 AutomaticChallenge 设置为 true 有何影响?我的发现告诉我,如果管道中有 UseOpenIdConnectAuthentication,则不应将此属性设置为 true,这是因为默认情况下 OIDC 中间件将 AutomaticChallenge 设置为 true。 github.com/aspnet/Announcements/issues/210
    • AutomaticChallenge 简单地定义了中间件是否应该像在请求未经授权时被直接要求发出质询一样行事。拥有其中两个有点毫无意义,因为只有一个注册得更接近未经授权的结果才会运行(即稍后注册的那个)。这实际上取决于您的特定用例,哪个中间件应该是默认的。 通常 OIDC 是默认设置,因为我们希望将用户重定向到登录提供程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多