我正在尝试实现一个基于 OpenIddict 的身份服务器。我们的用例是一个大型 JavaScript 应用程序,需要对多个后端 API 进行用户身份验证。JavaScript 应用程序使用密码流从专用 OpenIddict 服务器获取令牌。然后,前端调用的各种 API 会验证令牌。
我已经使用 ASP.NET Identity 和 EF 实现了服务器,并且可以成功检索有效令牌。我们的 API 在 AWS Lambda 中运行,因此我们不能(或不想)使用标准.AddDataProtection方法。我们使用存储在 S3 中的自签名证书来生成令牌并验证它们。
那么问题是,当我将 access_token 发送到后端 API 时,它们无法验证令牌并提供访问权限。我知道令牌是有效的,因为我可以使用JwtSecurityTokenHandler自签名证书在 Linqpad 中手动解密它们。
这是我的服务器配置:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
options.ClaimsIdentity.UserNameClaimType = Claims.Name;
options.ClaimsIdentity.UserIdClaimType = Claims.Subject;
options.ClaimsIdentity.RoleClaimType = Claims.Role;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddOpenIddict()
.AddCore(options =>
{
options.UseEntityFrameworkCore().UseDbContext<ApplicationDbContext>();
})
.AddServer(options =>
{
options.SetTokenEndpointUris("/connect/token");
options.AllowPasswordFlow();
options.AcceptAnonymousClients();
options.AddEncryptionCertificate(MyCustomCertificate);
options.AddSigningCertificate(MyOtherCustomCertificate);
options.UseAspNetCore().EnableTokenEndpointPassthrough();
});
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(connectionString);
options.UseOpenIddict(); …Run Code Online (Sandbox Code Playgroud)