资源服务器上的 OpenIddict MVC 核心 2.0 和 JWT API

OpenIddict MVC core 2.0 and JWT on resource server API

我一直在设置一个 OpenIdDict 授权服务器,以便与我们现有的 mvc 核心 2.0 Web 应用程序一起使用。在我们的生产应用程序上实现 OpenIdConnect 部分之前,我正在使用代码流并制作了一个测试 mvc webapp 资源服务器。

一切似乎都在按预期工作,我可以登录并访问我的资源。

我需要让 api 承载身份验证在新的身份验证架构下为我的其余客户端工作。 Api放在同一个资源服务器上

我已经为 JWT 设置了我的 OpenIddict 使用:

            options.AllowPasswordFlow();
            options.UseJsonWebTokens();
            options.AddSigningKey(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value)));

...添加了 JwtBearer

        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
        JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();

        services.AddAuthentication()
            .AddJwtBearer(options =>
            {
                options.Authority = "http://localhost:17004/";
                options.Audience = "MyAudience";
                options.RequireHttpsMetadata = false;
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = OpenIdConnectConstants.Claims.Subject,
                    RoleClaimType = OpenIdConnectConstants.Claims.Role,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value))
                };
            });

...并在 AuthorizationController.Exchange 中添加了用于处理密码流令牌请求的代码。

在我的资源服务器上 Startup.cs 我添加了 AddOpenIdConnect 并添加了 signingKey(与我的授权服务器上的密钥相同)。

            options.ResponseType = OpenIdConnectResponseType.Code;
            options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;
            options.TokenValidationParameters = new TokenValidationParameters()
            {
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("TokenAuthentication:SecretKey").Value))
            };
            options.Authority = "http://localhost:17004/";

设置后,我的资源服务器仍然可以进行身份​​验证,一切正常,我可以使用 restclient 从我的身份验证服务器获取 jwt 令牌,但是当尝试在资源服务器上访问我的 api 时失败因为没有承载方案的验证器。

如果我在 TokenValidationParameters 中使用相同的签名密钥在资源服务器上添加调用 AddBearerToken 的调用,它实际上可以工作。挑战成功,我可以访问我的资源了。

但是我怀疑我的设置远非正确,因为我可以看到,在调用我的 api 时,正在资源服务器上验证我的令牌,所以我留下了 2 个问题。

  1. 是否可以让 JwtBearer 中间件将验证转发到我的授权服务器? (openidConnect可以处理吗?)

  2. 是否可以让我的资源服务器 forward/passthru 令牌发布请求也成为我的身份验证服务器,这样我的其余 api 客户端就不必处理 2 个服务器?

JWT 是一种令牌格式,是 OpenIdConnect 所必需的。您可以将任何令牌格式与 Oauth2 一起使用,包括 JWT。所以你不需要跳过 JWT。

Is it possible to have the JwtBearer middleware forward the validation to my auth server? (can openidConnect handle it?)

JWT 承载中间件始终使用从 OpenIddict 的配置端点检索的签名密钥执行本地验证。你没有办法强制它把这个任务委托给 OpenIddict。

Is it possible to make my resource server forward/passthru token issue requests too my auth server so my rest api client wont have to deal with 2 servers?

如果您想将令牌验证部分委托给您的授权服务器,请不要使用 JWT 中间件。相反,在 OpenIddict 选项中启用自省,创建一个新的机密客户端应用程序注册并使用 aspnet-contrib introspection middleware,这将使用反向通道 HTTP 调用来验证传入的令牌。