.NET 4.6 中的 OpenIddict 3 不可用令牌验证

Posted

技术标签:

【中文标题】.NET 4.6 中的 OpenIddict 3 不可用令牌验证【英文标题】:OpenIddict 3 unavailable token validation from .NET 4.6 【发布时间】:2021-11-05 22:59:07 【问题描述】:

我有一个使用 OpenIddict 3.1 的身份服务器。我们在 .NET 4.6 中添加了资源 API。在启动类中,我们将令牌验证设置为在 [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)之间以这种方式验证令牌?

【问题讨论】:

您在日志中遇到什么错误?您还需要将身份验证错误与授权错误分开。 嗨,Tore,我们没有收到任何错误,我们有一个自定义的 Authorize 属性,在调用 base.SendGetAsync(request, canceltoken) 之后我们收到 401 Unauthorized 消息 通过删除授权属性进行测试,在操作方法中设置断点并检查用户对象是否包含用户。只是为了区分问题是否是身份验证(是否接受令牌?)形式授权(是否允许用户访问..) 也可以将示例访问令牌粘贴到问题中。 嗨 Toren,非常感谢,我们不确定这是否是身份验证的问题,因为 OpenIddict 创建了访问令牌和 Id 令牌,对于前端它工作正常,问题是什么时候前端发送 api 请求,api 请求尝试验证令牌,到达 api 的令牌是 Baerer 令牌,但不是 jwt 令牌 【参考方案1】:

OpenIDDict 支持两种类型的令牌:reference 令牌(只是一个二进制 blogb)和 JWT-tokens(包含用户详细信息和声明) . AddJwtBearer() 方法不支持引用令牌格式。

您需要做的是从您的设置中删除以下行:

options.UseReferenceTokens();

【讨论】:

以上是关于.NET 4.6 中的 OpenIddict 3 不可用令牌验证的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ASP.NET Core DataProtection 正确配置 OpenIddict

从 ASP.NET MVC 客户端应用程序和 .NET 5 openiddict 服务器注销。注销后重定向 URL 无效

asp.net core + angular2 JWT 承载

OpenIddict:如何在资源服务器中注册签名密钥以验证令牌?

.NET 4.6 不完全支持 Unity?

Visual Studio 2013 和 .NET 4.6