.NET 4.6 中的 OpenIddict 3 不可用令牌验证
OpenIddict 3 unavailable token validation from .NET 4.6
我有一个使用 OpenIddict 3.1 的身份服务器。我们在 .NET 4.6 中添加了资源 API。在启动 class 中,我们将令牌验证设置为在 [Authorize]
属性上使用它,如下所示:
var options = new JwtBearerAuthenticationOptions
{
Provider = new OAuthBearerAuthenticationProvider(),
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audience },
TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = true,
ValidateIssuer = false,
IssuerSigningKey = key(SigningCertificate from OpenIddict),
ValidateLifetime = true,
ValidAudience = audience,
RequireSignedTokens = true
}
};
app.UseJwtBearerAuthentication(options);
我们总是收到未经授权的消息。
我们也尝试过使用:
var options = new JwtBearerAuthenticationOptions
{
Provider = new OAuthBearerAuthenticationProvider(),
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audience },
TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = true,
ValidateIssuer = false,
IssuerSigningKeys = issuerSigningKeys,
ValidateLifetime = true,
ValidAudience = audience,
RequireSignedTokens = true
}
};
在 issuerSigningKeys
上,是从 OpenIddict 服务器 JWT 密钥中发现的密钥。
我们的服务器配置如下所示:
.AddValidation(options => {
options.UseLocalServer();
options.UseSystemNetHttp();
options.UseAspNetCore();
});
和
services
.AddAuthentication(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
options.Authority = "http://localhost:49424/";
options.MetadataAddress = "http://localhost:49424/";
options.Audience = "resource1";
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateIssuerSigningKey = true,
ValidAudiences = new List<string>
{
"resource1"
},
IssuerSigningKey = (new RsaSecurityKey(System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPublicKey(AuthenticationExtensionMethods.TokenSigningCertificate()))) // can still login with or without this key
};
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.LoginPath = "/Account/Logon";
});
有什么建议吗?是否可以使用 OpenIddict 在不同框架(例如 .NET Core 和 .NET Framework 4.6)之间以这种方式验证令牌?
OpenIDDict 支持两种类型的令牌:reference 令牌(只是一个二进制 blogb)和 JWT-tokens(包含用户详细信息和声明)。 AddJwtBearer()
方法不支持引用标记格式。
您需要做的是从您的设置中删除以下行:
options.UseReferenceTokens();
我有一个使用 OpenIddict 3.1 的身份服务器。我们在 .NET 4.6 中添加了资源 API。在启动 class 中,我们将令牌验证设置为在 [Authorize]
属性上使用它,如下所示:
var options = new JwtBearerAuthenticationOptions
{
Provider = new OAuthBearerAuthenticationProvider(),
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audience },
TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = true,
ValidateIssuer = false,
IssuerSigningKey = key(SigningCertificate from OpenIddict),
ValidateLifetime = true,
ValidAudience = audience,
RequireSignedTokens = true
}
};
app.UseJwtBearerAuthentication(options);
我们总是收到未经授权的消息。
我们也尝试过使用:
var options = new JwtBearerAuthenticationOptions
{
Provider = new OAuthBearerAuthenticationProvider(),
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audience },
TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = true,
ValidateIssuer = false,
IssuerSigningKeys = issuerSigningKeys,
ValidateLifetime = true,
ValidAudience = audience,
RequireSignedTokens = true
}
};
在 issuerSigningKeys
上,是从 OpenIddict 服务器 JWT 密钥中发现的密钥。
我们的服务器配置如下所示:
.AddValidation(options => {
options.UseLocalServer();
options.UseSystemNetHttp();
options.UseAspNetCore();
});
和
services
.AddAuthentication(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
options.Authority = "http://localhost:49424/";
options.MetadataAddress = "http://localhost:49424/";
options.Audience = "resource1";
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateIssuerSigningKey = true,
ValidAudiences = new List<string>
{
"resource1"
},
IssuerSigningKey = (new RsaSecurityKey(System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPublicKey(AuthenticationExtensionMethods.TokenSigningCertificate()))) // can still login with or without this key
};
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.LoginPath = "/Account/Logon";
});
有什么建议吗?是否可以使用 OpenIddict 在不同框架(例如 .NET Core 和 .NET Framework 4.6)之间以这种方式验证令牌?
OpenIDDict 支持两种类型的令牌:reference 令牌(只是一个二进制 blogb)和 JWT-tokens(包含用户详细信息和声明)。 AddJwtBearer()
方法不支持引用标记格式。
您需要做的是从您的设置中删除以下行:
options.UseReferenceTokens();