同一站点中的 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 身份验证的主要内容,如果未能解决你的问题,请参考以下文章