多个身份验证中间件 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
进行验证。
我对中间件的概念比较陌生。我知道中间件在完成时会调用下一个中间件。
我正在尝试使用 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
进行验证。