多个身份验证中间件 ASP.NET 核心

Multiple Authentication Middlewares ASP.NET Core

我对中间件的概念比较陌生。我知道中间件在完成时会调用下一个中间件。

我正在尝试使用 Google 或我的身份服务器对请求进行身份验证。用户可以使用 google 或本地帐户登录我的移动应用程序。但是,我不知道如何使用这两个身份验证中间件。如果我为 google 传递 id_token,它会传递第一个中间件 (UseJwtBearerAuthentication),但会传递第二个中间件 (UseIdentityServerAuthentication)。我怎样才能让它在实际传递至少 1 个身份验证中间件时不会抛出错误?比如它传递了第一个中间件,第二个中间件就被忽略了?

app.UseJwtBearerAuthentication(new JwtBearerOptions()
{
    Authority = "https://accounts.google.com",
    Audience = "secret.apps.googleusercontent.com",
    TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateAudience = true,
        ValidIssuer = "accounts.google.com"
    },
    RequireHttpsMetadata = false
});

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
    Authority = "http://localhost:1000/",
    RequireHttpsMetadata = false,

    ScopeName = "MyApp.Api"
});

通常情况下,当一个认证中间件失败时(我不是说抛出异常),这不会影响另一个成功的认证中间件。可能你的第二个中间件抛出异常(不是验证失败)。首先检查错误消息并尝试解决它。如果不能,使用 AuthenticationFailed 事件来处理错误。在这种情况下,您的代码应如下所示:

 app.UseJwtBearerAuthentication(new JwtBearerOptions()
 {
     // ...
     Events = new JwtBearerEvents()
     {
          OnAuthenticationFailed = async (context) =>
          {
              if (context.Exception is your exception)
              {
                   context.SkipToNextMiddleware();
              }
          }
     }
 });

但是,对于你的场景我不会选择你的方式。我只会使用身份服务器端点。要使用 google 签名,您可以像下面这样配置身份服务器:

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme,
            AutomaticAuthenticate = false,
            AutomaticChallenge = false
        });

        app.UseGoogleAuthentication(new GoogleOptions
        {
            AuthenticationScheme = "Google",
            SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme,
            ClientId = "",
            ClientSecret = ""
        });

        app.UseIdentityServer();

编辑

AuthenticationFailed 事件似乎无法用于 IdentityServer4.AccessTokenValidation。我不确定,但如果您仅将身份服务器用于 jwt 令牌,则可以使用 UseJwtBearerAuthentication 进行验证。