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

问题描述 投票:0回答:2

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

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

我需要让 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时,它会失败,因为没有承载方案的验证器.

如果我添加调用以在资源服务器上调用

AddBearerToken
,并在
signingKey
中使用相同的
TokenValidationParameters
,它实际上可以工作。挑战成功,我可以使用我的资源了。

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

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

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

c# .net jwt asp.net-core-mvc openiddict
2个回答
1
投票

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

JWT 承载中间件始终使用从 OpenIddict 的配置端点检索的签名密钥执行本地验证。您无法强制它将此任务委托给 OpenIddict。

是否可以让我的资源服务器也向我的身份验证服务器转发/直通令牌发出请求,这样我的其余 api 客户端就不必处理 2 个服务器?

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.