2017-06-22 82 views
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; 
} 

感谢,

回答

0

比Microsoft Graph API,您必须在令牌请求中指定您的API为resource

确保:

  1. 你的网络API已经配置OAuth2Permission作用域。看这里。 Configuring a resource application to expose web APIs
  2. 客户端应用程序已经选择权限,这些公开的API。 Configuring a client application to access web APIs
  3. 最后,确保你使用你的Web API的App ID URI或应用ID GUID在你的令牌请求的资源价值。

让我知道这是否有帮助!

+0

谢谢你的回答。但是,我遇到了一些新问题:在第2步中,我注册的客户端应用程序是一个融合应用程序。它只能从Microsoft Graph中添加权限,而不能从我的API中添加权限。如果我带上我的API的App ID URI,我得到一个错误,说明该范围对于我的客户端不存在。因此,我在Azure Portal中注册了一个客户端应用程序,并在步骤2中提到了API应用程序的许可权,但在步骤3中,我从v2.0端点获得了一个错误:AADSTS70001:此API版本不支持应用程序“xxxx”。我正在使用v2.0终结点的MSAL。它只支持融合应用程序客户端吗? – up2pixy

+0

眼下V2应用模式只支持[单机Web的API(https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-limitations#restrictions-on-app -types)。可能需要在场景中完全使用V1应用程序模型,这意味着使用ADAL和V1端点。 –

相关问题