Azure Active Directory - 从JWT令牌挖掘oAuth2Permission,appRole和组声明

时间:2017-10-12 19:05:00

标签: azure azure-active-directory

场景:我在不同的Azure租户中有2个AAD应用程序 - 让我们调用租户A和B.租户A中的应用程序定义了租户B中的应用程序同意的自定义appRole和oAuth2Permissions.Tantant B中的应用程序定义了KeyCredential使用自己的证书。

我能够使用ADAL v3成功获得JWT令牌 ClientAssertionCertificate(资源是租户A中的应用程序,客户端是租户B中的应用程序),如下所示:

        AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);
        X509Certificate2 cert = AuthHelper.FindCertificateByThumbprint("<Thumbprint of the Tenant B app's KeyCredential cert>");
        ClientAssertionCertificate assertionCert = new ClientAssertionCertificate(clientId, cert);
        AuthenticationResult authenticationResult = authenticationContext.AcquireTokenAsync(resource, assertionCert).Result;
        string accessToken = authenticationResult.AccessToken; // Valid.
        string idToken = authenticationResult.IdToken; // Null.

AcquireTokenAsync的AuthenticationResult包含我可以成功验证的AccessToken ......

        string issuer = string.Format(ConfigurationManager.AppSettings["issuer"], ConfigurationManager.AppSettings["tenantid"]);
        string audience = ConfigurationManager.AppSettings["audience"];
        string certThumbprint = ConfigurationManager.AppSettings["certThumbprint"];
        var stsDiscoveryEndpoint = string.Concat(issuer, URI_DELIMITER, STS_DISCOVERY_ENDPOINT_SUFFIX);

        ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint);
        var config = configManager.GetConfigurationAsync().Result;

        // extract issuer and token for validation
        var authority = config.Issuer;
        var signingTokens = config.SigningTokens.ToList();

        sys.TokenValidationParameters validationParameters = new sys.TokenValidationParameters
        {
            ValidIssuer = issuer,
            ValidAudience = audience,
            ValidateLifetime = true,
            IssuerSigningTokens = signingTokens,
            CertificateValidator = X509CertificateValidator.None,                
        };

        sys.JwtSecurityTokenHandler tokendHandler = new sys.JwtSecurityTokenHandler();
        sys.SecurityToken jwt;
        var result = tokendHandler.ValidateToken(token, validationParameters, out jwt);
  1. 然而,IdToken是空的。这是因为我没有将UserAssertion传入AcquireTokenAsync调用吗?

  2. 为了能够进一步授权请求,我正在寻找 - appRole,oAuth2Permissions和groupMembership声明。但是,这些声明不在AccessToken中。如果这是预期的,那么我何时在令牌中找到所述声明。如果不是这样,我在令牌生成或AAD应用程序设置中遗漏了什么导致这种情况?

  3. 注意:我的方案不涉及Web API(但它是WAAD绑定的)所以我必须手动进行令牌验证和授权。

1 个答案:

答案 0 :(得分:1)

  1. 只有在您遵循涉及用户的身份验证流程时,才会生成ID令牌。 在你的身份验证中,你没有签署用户,所以我无法理解你期望获得什么样的ID令牌......

    您需要遵循授权代码授予流程来登录用户,并获得委派代币。

  2. 我有a blog post关于如何让groupMembership声明出现在两个应用程序之间。

    没有这样的想法作为&#34; oAuth2Permission&#34;在访问令牌中声明。您可以找到AAD here支持的所有不同令牌和声明。

    最终,您应该依靠AAD Graph API来获取这些详细信息,而不是令牌,因为令牌具有内在大小限制,可能会遗漏有关某些角色或组的数据。