AspNetCore 2:用于Web的OpenIdConnect Cookie,用于API的JWT Bearer。可能吗?

时间:2017-08-22 22:11:56

标签: asp.net openid-connect

我正在开发一个AspNetCore 2应用程序,其中包含Web视图和API(带有/ api前缀),我正在尝试使用OpenIdConnect + cookie对Web视图进行身份验证,而使用JWT令牌对/ api前缀路由进行身份验证(用于移动应用程序兼容性)。

到目前为止,我已设法使用此代码注册和配置Cookie,OpenIdConnect和JWT中间件:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  .AddCookie()
  .AddOpenIdConnect(options => {
    var optionsSetup = new OpenIdConnectOptionsSetup(b2cOptions);
    optionsSetup.Configure(options);
  });

services.AddAuthentication()
  .AddJwtBearer(options => {
    var optionsSetup = new JWTBearerOptionsSetup(b2cOptions);
    optionsSetup.Configure(options);
  });

配置方法中的这一行:

app.UseAuthentication();

OpenIdConnectOptionsSetup取自(稍作修改)aspnetcore AD B2C示例存储库。

JWTBearerOptionsSetup是来自aspnetcore AD B2C示例repo的重构,用于将JWT配置代码提取到外部类中。

现在,对于/ api端点的AJAX调用正在通过OpenId重定向到AD的登录策略端点,因此Cookie / OpenIdConnect中间件正在处理这些。我需要一种让/ api直接进入JWTBearer中间件的方法。

这可能吗?我必须将Web和API项目分开吗?

1 个答案:

答案 0 :(得分:1)

我建议您将 web 和 api 分离到单独的服务中,否则将更难以推理系统的行为。系统故障排除也会更容易。

cookieJWtBearer 处理程序都将尝试在您的系统中创建 ClaimsPrincipal 用户对象,无论是从会话 cookie 还是从访问令牌。