OIDC - 验证JWT以避免篡改

时间:2018-03-14 21:35:17

标签: asp.net asp.net-core azure-active-directory asp.net-core-2.0 oidc

我使用ASP.NET Core v2的AddOpenIdConnect身份验证扩展方法轻松地与Azure AD提供程序建立OIDC。

这是我在Startup.cs课程中正在做的一个友好的例子。

 public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(options =>
    {
        // Setup default schemes...
    })
    .AddOpenIdConnect("OpenIdConnect-Scheme", "Azure AD", options =>
    {
        const string clientId = "myClientId";
        const string instance = "https://login.microsoftonline.com/";
        const string tenantId = "myTenantId";

        options.Authority = $"{instance}{tenantId}";
        options.ClientId = clientId;
        options.UseTokenLifetime = true;
        options.CallbackPath = "/signin-oidc";
        options.RequireHttpsMetadata = true;
    });

    // Additional setup
}

由于我们的安全要求,我需要记录 我们的网络应用程序如何验证通过OIDC传回给我们的JWT /令牌没有被截获,被篡改,或伪造"。

ASP.NET Core如何验证权威机构传回的JWT?如果没有处理,我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

正如其他人在评论中指出的那样,由于ASP.NET Core是开源的,您可以在GitHub上浏览确切的过程:OpenIdConnectHandler.cs

通常,它是TLS和(有时)令牌签名验证的组合:

  • TLS 即可。用于执行OpenID discovery process的HTTP请求由TLS保护。发现过程提供将用于登录过程和令牌颁发的可信端点,以及用于令牌签名验证的公钥。在收到ID令牌作为对受TLS保护的HTTP请求的响应的流程中,它是提供保护的TLS。
  • 签名验证。在一些流程(例如,混合和隐式)中,验证ID令牌的加密签名。通过OpenID配置发现过程,应用程序将检索(使用TLS)OpenID Discovery文档,其中包括JWKS文档的URL(也使用TLS检索),其中包含身份提供者使用的公钥(Azure AD,in这个案例)。公钥用于验证它确实是签署令牌的受信任机构,并且自签名生成以来内容未被篡改。

    注意:某些流程(例如授权代码)不需要令牌签名验证,因为该令牌是作为对受TLS保护的HTTP请求的响应而检索的。

因此,在您的示例中,保护链始于https://中的"https://login.microsoftonline.com/..."。 OpenID Discovery端点基于此构建(https://login.microsoftonline.com/{tenant-id}/.well-known/openid-configuration)。这将返回其他受TLS保护的端点,用于登录,令牌颁发和用于签名验证的公钥。