Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET核心中执行中间件_C#_Asp.net Core_Middleware - Fatal编程技术网

C# 如何在ASP.NET核心中执行中间件

C# 如何在ASP.NET核心中执行中间件,c#,asp.net-core,middleware,C#,Asp.net Core,Middleware,我正在将Auth0添加到简单项目中,并试图了解中间件是如何工作的 在我的Startup.cs中,我有以下代码 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IOptions<AuthSettings> auth0Settings) { loggerFactory.AddConsole(Configuration.GetS

我正在将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}");
    });
}
将不执行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
,它也不会在请求中找到任何有趣的内容。它正在寻找对其回调路径的请求,默认情况下,回调路径设置为
CallbackPath=newpathString(“/signin-oidc”)中的


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

您对“AutomaticChallenge”属性有何评论?在UseCookieAuthentication中间件中将AutomaticChallenge设置为true会产生什么影响?我的发现告诉我,如果管道中有UseOpenIdConnectAuthentication,则不应将此属性设置为true,这是因为OIDC中间件在默认情况下已将AutomaticChallenge设置为true。AutomaticChallenge简单地定义了中间件是否应该像在请求未经授权时被直接请求发出质询一样工作。有两个是没有意义的,因为只有一个注册的更接近未经授权的结果运行(即稍后注册的结果)。这实际上取决于您的特定用例,哪个中间件应该是默认的。通常,OIDC是默认值,因为我们希望用户被重定向到登录提供程序。
app.UseMvc(routeBuilder =>
{
     routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}");
});