0
我有一個Angular 4站點,我正在嘗試使用Microsoft Graph隱式流來驗證用戶,然後使用令牌在另一個端點調用我們的API,因此我使用msal.js獲取訪問令牌。Microsoft Graph API訪問令牌的簽名驗證失敗
後,我把訪問令牌我的API端點,並嘗試有效的話,該令牌可以是無效的。我有一個SignatureVerificationFailedException。
我的理解是,訪問令牌是針對微軟圖形API,而不是我的API,這樣我就可以無效的。 (我可以用它來調用Graph API沒有問題)
我怎樣才能獲得一個訪問令牌(不是id令牌)使用msal.js可以用於我的API但不是Microsoft Graph?謝謝!
我向API端點發送訪問令牌而不是ID令牌的原因是我想從令牌獲取puid聲明,該令牌不能用於id令牌。
這是我試圖有效的訪問令牌,我從客戶端得到了。如果你想獲得一個訪問令牌的API,而這是使用msal.js
const string authority = "https://login.microsoftonline.com/common";
const string audience = "https://graph.microsoft.com";
string issuer = null;
string stsDiscoveryEndpoint = $"{authority}/v2.0/.well-known/openid-configuration";
List<SecurityToken> signingTokens = null;
var configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint);
var config = await configManager.GetConfigurationAsync();
issuer = config.Issuer;
signingTokens = config.SigningTokens.ToList();
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters
{
ValidAudience = audience,
ValidIssuer = issuer,
ValidateIssuer = false,
IssuerSigningTokens = signingTokens,
CertificateValidator = X509CertificateValidator.None
};
try
{
// Validate token.
SecurityToken validatedToken = new JwtSecurityToken();
var claimsPrincipal = tokenHandler.ValidateToken(jwtToken, validationParameters, out validatedToken);
var claimsIdentity = claimsPrincipal.Identity as ClaimsIdentity;
return ExtractAuthenticatedUserFromClaimsIdentity(claimsIdentity);
}
catch (SignatureVerificationFailedException)
{
throw;
}
感謝,
謝謝你的回答。但是,我遇到了一些新問題:在第2步中,我註冊的客戶端應用程序是一個融合應用程序。它只能從Microsoft Graph中添加權限,而不能從我的API中添加權限。如果我帶上我的API的App ID URI,我得到一個錯誤,說明該範圍對於我的客戶端不存在。因此,我在Azure Portal中註冊了一個客戶端應用程序,並在步驟2中提到了API應用程序的許可權,但在步驟3中,我從v2.0端點獲得了一個錯誤:AADSTS70001:此API版本不支持應用程序「xxxx」。我正在使用v2.0終結點的MSAL。它只支持融合應用程序客戶端嗎? – up2pixy
眼下V2應用模式只支持[單機Web的API(https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-limitations#restrictions-on-app -types)。可能需要在場景中完全使用V1應用程序模型,這意味着使用ADAL和V1端點。 –