我目前正在开发一个 OWIN OAuth 实现,它使用 JWT 并支持令牌刷新。我在令牌刷新过程中遇到间歇性问题。该过程在我的开发环境中可靠地运行,但是当发布到我们的 Azure Service Fabric 测试环境(该环境是在 3 节点负载平衡配置中设置)时,刷新令牌请求经常失败(并非总是如此!),并且我得到了臭名昭著的错误“无效授权”错误。
我发现刷新令牌在由最初发出刷新令牌的同一服务结构节点处理时可以成功工作。然而,当由不同的节点处理时,它总是失败。
我的理解是,通过使用 JWT,让微服务基础设施提供负载平衡的身份验证服务器,可以解决因使用 OWIN 提供的 OOTB 访问令牌格式而产生的“机器密钥”相关问题。
失败的刷新令牌正在进入 IAuthenticationTokenProvider.ReceiveAsync 方法,但 OAuthAuthorizationServerProvider.GrantRefreshToken 方法从未被命中,这表明 OWIN 中间件中的某些内容对刷新令牌不满意。任何人都可以提供任何见解可能是什么原因吗?
现在对于代码来说,有相当多的内容 - 对所有阅读表示歉意!
身份验证服务器是一个 Service Fabric 无状态服务,这是ConfigureApp 方法:
protected override void ConfigureApp(IAppBuilder appBuilder)
{
appBuilder.UseCors(CorsOptions.AllowAll);
var oAuthAuthorizationServerOptions = InjectionContainer.GetInstance<OAuthAuthorizationServerOptions>();
appBuilder.UseOAuthAuthorizationServer(oAuthAuthorizationServerOptions);
appBuilder.UseJwtBearerAuthentication(InjectionContainer.GetInstance<JwtBearerAuthenticationOptions>());
appBuilder.UseWebApi(GetHttpConfiguration(InjectionContainer));
}
Run Code Online (Sandbox Code Playgroud)
这是 OAuthAuthorizationServerOptions 的实现:
public class AppOAuthOptions : OAuthAuthorizationServerOptions
{
public AppOAuthOptions(IAppJwtConfiguration configuration,
IAuthenticationTokenProvider authenticationTokenProvider,
IOAuthAuthorizationServerProvider authAuthorizationServerProvider)
{
AllowInsecureHttp = true;
TokenEndpointPath = "/token";
AccessTokenExpireTimeSpan = configuration.ExpirationMinutes;
AccessTokenFormat = new AppJwtWriterFormat(this, configuration); …Run Code Online (Sandbox Code Playgroud)