C# 当MVC客户端配置为'UseAuthorization',然后配置为'UseAuthorization',而不是相反时,重定向循环

C# 当MVC客户端配置为'UseAuthorization',然后配置为'UseAuthorization',而不是相反时,重定向循环,c#,asp.net-core,C#,Asp.net Core,我遇到了一个问题,我现在已经解决了,但我不知道到底发生了什么 当设置一个示例MVC应用程序来使用IdentityServer4(我一直在关注)时,我应该通过添加app.UseAuthentication(),确保在每个请求上执行身份验证服务在启动类中配置功能: public void配置(IApplicationBuilder应用程序,IWebHostEnvironment环境) { if(env.IsDevelopment()) { app.UseDeveloperExceptionPage(

我遇到了一个问题,我现在已经解决了,但我不知道到底发生了什么

当设置一个示例MVC应用程序来使用IdentityServer4(我一直在关注)时,我应该通过添加
app.UseAuthentication(),确保在每个请求上执行身份验证服务中的code>在
启动
类中配置
功能:

public void配置(IApplicationBuilder应用程序,IWebHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Home/Error”);
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();//如果我们想调用MVC和IdentityServer之间的交互,这里的这一位就是所需更改的示例。
app.UseAuthorization();
app.UseEndpoints(端点=>
{
endpoints.mapDefaultControllerOute()
.RequireAuthorization();
});
}
最初发生的事情是,我意外地颠倒了调用
UseAuthentication()
UseAuthentication()
的顺序。而不是:

app.UseAuthentication();
app.UseAuthorization();
我有:

app.UseAuthorization();
app.UseAuthentication();
这导致MVC应用程序以无限重定向循环结束。现在我知道对
UseAuthentication()
UseAuthentication()
的调用顺序很重要,但具体是什么导致了循环?我仍然在想OpenID连接协议,所以这个问题可能很简单(我希望不是)

我已经建立了一个存储库,其中包含最少的工作示例,以再现该问题:


这与OIDC或任何其他协议完全无关。这就是ASP.NET核心的工作方式

当您这样做时:

  • app.UseAuthorization()
  • app.UseAuthentication()
  • 您的意思是:“首先尝试授权用户,然后尝试验证请求”,但您不知道是否有用户,因为您还没有尝试从请求中确定用户,因此您需要先尝试,但您不能,因为您仍然没有经过验证的用户(在这一点上,无限循环是显而易见的)

    另一方面,当您这样做时:

  • app.UseAuthentication();
  • app.UseAuthorization();
  • 您的意思是:“首先尝试验证请求,完成验证后,检查用户是否具有必要的权限”(即使这仅仅意味着确实存在经过验证的用户)


    始终验证在ASP.NET Core中注册中间件的顺序,因为处理请求时将使用完全相同的顺序。在许多其他情况下,不是无限循环,而是中间件损坏。

    这与OIDC或任何其他协议完全无关。这是juASP.NET核心的工作方式

    当您这样做时:

  • app.UseAuthorization();
  • app.UseAuthentication();
  • 您的意思是:“首先尝试授权用户,然后尝试验证请求”,但您不知道是否有用户,因为您还没有尝试从请求中确定用户,因此您需要先尝试,但您不能,因为您仍然没有经过验证的用户(在这一点上,无限循环是显而易见的)

    另一方面,当您这样做时:

  • app.UseAuthentication();
  • app.UseAuthorization();
  • 您的意思是:“首先尝试验证请求,完成验证后,检查用户是否具有必要的权限”(即使这仅仅意味着确实存在经过验证的用户)

    始终验证在ASP.NET Core中注册中间件的顺序,因为处理请求时将使用完全相同的顺序。在许多其他情况下,不是无限循环,而是中间件崩溃