aspnetcore 2.0 JWT 和 Open ID Connect 身份验证在同一站点中



我们有一个aspnetcore 2.0网站。该网站的大部分是WebAPI,具有2个UI组件:招摇和hangfire仪表板。

我们正在尝试使用 JWT 和具有 Open ID 的 UI(hangfire 仪表板(组件来保护 Web API 终结点。

这是我们的设置

services
.AddSingleton<IConfigureOptions<JwtBearerOptions>, ConfigureJwtBearerOptions>()
.AddSingleton<IConfigureOptions<OpenIdConnectOptions>, ConfigureOpenIdOptions>()
.AddAuthentication(options =>
 {
    var openId = OpenIdConnectDefaults.AuthenticationScheme;
    var jwt = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultScheme = jwt;
    //options.DefaultAuthenticateScheme = openId;
 })
 .AddJwtBearer()
 .AddCookie()
 .AddOpenIdConnect(options =>
 {
     var cookies = CookieAuthenticationDefaults.AuthenticationScheme;
     options.SignInScheme = cookies;
     options.SignOutScheme = cookies;
 });
services
.AddAuthorization(options => options.AddPolicy(...))
.AddMvcCore(config =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
        .Build();
    config.Filters.Add(new AuthorizeFilter(policy));
});
....
app.Map(new PathString("/hangfire"), _ => _.UseMiddleware<HangfireDashboardMiddleware>(...));

为了保护 hangfire 仪表板,我们必须创建一个委派处理程序来使用 OpenIdConnectDefaults.AuthenticationScheme 进行身份验证和质询。

问题是我们只能让 JWT 或 OpenID 成功授权并获得所有相关声明。当//options.DefaultAuthenticateScheme = openId;被注释掉时,JWT可以工作,但OpenId陷入了localhost和AAD之间的永久循环。设置options.DefaultAuthenticateScheme = openId;后,开放 ID 身份验证工作正常,但 JWT 无法获取声明。它似乎确实经过身份验证。

如何为每个路由设置身份验证方案?

我们终于想通了。 ASPnetcore 在设计上只处理 1 个方案。因此,为了处理多个方案,我们需要实现一个自定义方案。

我们 https://gist.github.com/profet23/da146bfee5e2daa45bc4f9746aba69e0 使用这种方法来选择十几个方案

相关内容

最新更新