我们有一个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 使用这种方法来选择十几个方案