【问题标题】:Authenticating with RSA using JWT on Owin在 Owin 上使用 JWT 使用 RSA 进行身份验证
【发布时间】:2017-01-22 00:50:57
【问题描述】:

考虑在我的 Web API 2 中使用 Owin 中间件的代码:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        ConfigureAuthentication(app);
        app.UseCors(CorsOptions.AllowAll);
        WebApiConfig.Register(config);
        app.UseWebApi(config);
        config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;    
    }

    private static void ConfigureAuthentication(IAppBuilder app)
    {
        var issuer = "<<MyIssuer>>";
        var audience = "<<MyAudience>>";

        const string publicKeyBase64 = "<<MyPublicKeyBase64>>";

        var certificate = new X509Certificate2(Convert.FromBase64String(publicKeyBase64));

        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
                AllowedAudiences = new[] { audience },
                IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                {
                  new X509CertificateSecurityTokenProvider(issuer, certificate),
                }
            }
        );
    }
}

我可以从我的 IDP 中获取 Bearer 令牌并在 jwt.io 中对其进行测试,结果如下:

Issuer 匹配从代码到已验证令牌。

ClientId 匹配从代码到已验证令牌 (sub)。

Audience 匹配从代码到已验证令牌。

出于某种原因 - 然而,令牌在每个请求上都被拒绝(401 Unauthorized),我只是无法理解为什么。我的请求包括Authorization 标头,它具有相同的承载令牌,我可以使用jwt.io (Bearer ey..) 进行验证。如果有什么不同,我会使用Auth0。我还可以提一下,我已尝试下载公共证书并使用该文件,而不是仅使用具有相同结果的公钥字符串。

【问题讨论】:

  • 您的凭据在您的图像中并未完全混淆;有可能读取密钥,有人这么倾向于。如果这些代币仍在流通,我建议您撤销它们。
  • 这其实只是一个样例项目,key早就过期了,不过还是谢谢大家的关心;)

标签: c# asp.net-web-api rsa owin jwt


【解决方案1】:

设置JwtBearerAuthenticationOptions 实例的TokenValidationParameters 属性有助于解决问题:

private static void ConfigureAuthentication(IAppBuilder app)
{
    var issuer = "<<MyIssuer>>";
    var audience = "<<MyAudience>>";

    const string publicKeyBase64 = "<<MyPublicKeyBase64>>";

    var certificate = new X509Certificate2(Convert.FromBase64String(publicKeyBase64));

    app.UseJwtBearerAuthentication(
        new JwtBearerAuthenticationOptions
        {
            AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
            AllowedAudiences = new[] { audience },
            IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
            {
              new X509CertificateSecurityTokenProvider(issuer, certificate),
            },
            TokenValidationParameters = new TokenValidationParameters
            {
                IssuerSigningKeyResolver = (a, b, c, d) => new X509SecurityKey(certificate),
                ValidAudience = audience,
                ValidIssuer = issuer
            }           
        }
    );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2021-04-16
    • 2023-03-27
    • 2021-05-29
    • 2017-07-30
    相关资源
    最近更新 更多