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

同一站点中的aspnetcore 2.0 JWT和Open ID Connect身份验证,jwt,asp.net-core-2.0,openid-connect,hangfire,Jwt,Asp.net Core 2.0,Openid Connect,Hangfire,我们有一个aspnetcore 2.0网站。该站点的大部分是WebAPI,有两个UI组件:swagger和dashboard 我们正在尝试使用JWT和具有开放ID的UI(hangfire dashboard)组件来保护Web API端点 这是我们的设置 services .AddSingleton<IConfigureOptions<JwtBearerOptions>, ConfigureJwtBearerOptions>() .AddSingleton<IConf

我们有一个aspnetcore 2.0网站。该站点的大部分是WebAPI,有两个UI组件:swagger和dashboard

我们正在尝试使用JWT和具有开放ID的UI(hangfire dashboard)组件来保护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>(...));
服务
.AddSingleton()
.AddSingleton()
.AddAuthentication(选项=>
{
var openId=OpenIdConnectDefaults.AuthenticationScheme;
var jwt=JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme=jwt;
//options.DefaultAuthenticateScheme=openId;
})
.AddJwtBearer()
.AddCookie()
.AddOpenIdConnect(选项=>
{
var cookies=CookieAuthenticationDefaults.AuthenticationScheme;
options.signnscheme=cookies;
options.SignOutScheme=cookies;
});
服务
.AddAuthorization(选项=>options.AddPolicy(…)
.AddMvcCore(配置=>
{
var policy=new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()文件
.addAuthenticationScheme(JwtBearerDefaults.AuthenticationScheme)
.Build();
config.Filters.Add(新的授权过滤器(策略));
});
....
app.Map(新路径字符串(“/hangfire”),\u=>\ uu.useMediddleware(…);
为了保护hangfire仪表板的安全,我们必须创建一个委派处理程序,以便使用
OpenIdConnectDefaults.AuthenticationScheme
进行身份验证和质询

问题是我们只能让JWT或OpenID成功授权并获得所有相关声明。 当
//options.DefaultAuthenticateScheme=openId时被注释掉了,JWT可以工作,但OpenId被卡在本地主机和AAD之间的永久循环中。
当
options.DefaultAuthenticateScheme=openId时
设置为Open ID身份验证正常工作,但JWT无法获取声明。它似乎确实在进行身份验证


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

我们终于解决了这个问题。aspnetcore设计仅处理1个方案。因此,要处理多个方案,我们需要实现一个自定义方案


我们使用这种方法来选择bewteen方案

我的情况非常相似,我对您的一句话“aspnetcore仅处理1个设计方案”感到有点困惑。这是真的吗?msdn/github上的官方文档/示例使用多个身份验证方案。在我们实施身份验证时,这似乎是正确的。这对我们来说也是一件新鲜事,我们边走边琢磨。这对我们来说是有效的,我们没有重新审视我们的解决方案,因为它正在工作。与此同时,我能够配置3个方案:)2个使用JWT,1个使用amx。所以现在确实有可能,这个问题引导我走上正确的道路: