我一直在设置一个 OpenIdDict authserver 以与我们现有的 mvc core 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 个问题。
是否可以让 JwtBearer 中间件将验证转发到我的身份验证服务器?(openidConnect 可以处理吗?)
是否可以让我的资源服务器转发/通过令牌发出请求也是我的身份验证服务器,这样我的休息 api 客户端就不必处理 2 个服务器?