如何在ASP.NET Core中执行中间件

Vit*_*lii 2 c# middleware asp.net-core

我正在将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}");
    });
}
Run Code Online (Sandbox Code Playgroud)

如果我在我们的示例中正确理解ASP.NET Core中的中间件的想法,如果存在cookie并且可以通过它进行身份验证

 app.UseCookieAuthentication(new CookieAuthenticationOptions
 {
      AutomaticAuthenticate = true,
      AutomaticChallenge = true
 });
Run Code Online (Sandbox Code Playgroud)

OpenId中间件不会被执行.

 app.UseOpenIdConnectAuthentication(options);
Run Code Online (Sandbox Code Playgroud)

有人可以解释我OpenId中间件如何知道它不应该被执行?

在底部我们有

app.UseMvc(routeBuilder =>
{
     routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}");
});
Run Code Online (Sandbox Code Playgroud)

它是如何知道它应该总是被执行但是如果我们请求一些静态文件我们不使用mvc.

juu*_*nas 5

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

AutomaticAuthenticate在身份验证中间件总是意味着"检查传入的请求.如果您找到感兴趣的东西,请从中创建一个ClaimsPrincipal".在这种情况下,在将请求传递给下一个中间件之前,cookie身份验证会在登录cookie位于请求中时自动为登录用户创建主体.

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

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