场景:我在不同的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);
然而,IdToken是空的。这是因为我没有将UserAssertion传入AcquireTokenAsync调用吗?
为了能够进一步授权请求,我正在寻找 - appRole,oAuth2Permissions和groupMembership声明。但是,这些声明不在AccessToken中。如果这是预期的,那么我何时在令牌中找到所述声明。如果不是这样,我在令牌生成或AAD应用程序设置中遗漏了什么导致这种情况?
注意:我的方案不涉及Web API(但它是WAAD绑定的)所以我必须手动进行令牌验证和授权。
答案 0 :(得分:1)
只有在您遵循涉及用户的身份验证流程时,才会生成ID令牌。 在你的身份验证中,你没有签署用户,所以我无法理解你期望获得什么样的ID令牌......
您需要遵循授权代码授予流程来登录用户,并获得委派代币。
我有a blog post关于如何让groupMembership声明出现在两个应用程序之间。
没有这样的想法作为&#34; oAuth2Permission&#34;在访问令牌中声明。您可以找到AAD here支持的所有不同令牌和声明。
最终,您应该依靠AAD Graph API来获取这些详细信息,而不是令牌,因为令牌具有内在大小限制,可能会遗漏有关某些角色或组的数据。