同一站点中的 asp net core 2.0 JWT 和 Openid Connect 身份验证

Posted

技术标签:

【中文标题】同一站点中的 asp net core 2.0 JWT 和 Openid Connect 身份验证【英文标题】:aspnetcore 2.0 JWT and Open ID Connect Authentication in same site 【发布时间】:2018-07-03 16:43:48 【问题描述】:

我们有一个 aspnetcore 2.0 网站。该网站的大部分内容是 WebAPI,有 2 个 UI 组件:swagger 和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; 时,Open ID 身份验证工作正常,但 JWT 无法获取声明。它似乎确实可以进行身份​​验证。

我们如何设置每个路由的身份验证方案?

【问题讨论】:

【参考方案1】:

我们终于想通了。 aspnetcore 仅按设计处理 1 个方案。所以要处理多个方案,我们需要实现一个自定义方案。

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

【讨论】:

我的情况非常相似,我对您的句子“aspnetcore 仅处理 1 个设计方案”感到有些困惑。这是真的? msdn/github 上的官方文档/示例使用多种身份验证方案。 这在我们实施身份验证时似乎是正确的。这对我们来说也是新的,我们一直在弄清楚。这对我们有用,而且我们没有重新审视我们的解决方案,因为它正在工作。 与此同时,我能够配置 3 个方案 :) 2 个使用 JWT,1 个使用 amx。所以现在确实有可能,这个问题让我走上了正确的道路:***.com/questions/49694383/…

以上是关于同一站点中的 asp net core 2.0 JWT 和 Openid Connect 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2.0 为同一端点结合了 Cookie 和承载授权

没有身份的 ASP.NET Core 2.0 承载身份验证

ASP.NET Core 2.0中的HttpContext

ASP.NET Core 2.0 中的多个身份

ASP.NET CORE 2.0 中的 FromUri

ApplicationUser在Asp.Net Core 2.0中的ActionFilter中?