通过使用用于AzureBearerAuthentication的JWT获取访问令牌

我有一个使用Windows Azure Active Directory承载身份验证来验证用户身份的WebApi应用程序.验证用户身份后,我想查询Azure的Graph Api以获取有关用户的更多信息.

我有一个可行的解决方案,但看起来很笨拙.我阅读了Authorization标头并剥离了承载部分,然后使用AquireToken获取新令牌:

var authHeader = HttpContext.Current.Request.Headers["Authorization"];
var tokenMatch = Regex.Match(authHeader, @"(?<=^\s*bearer\s+).+$", RegexOptions.IgnoreCase);

var result = authInfo.AuthContext.AcquireToken(resourceId, authInfo.Credential, 
    new UserAssertion(tokenMatch.Value));

return result.AccessToken;

必须有更好的方法,但是我已经尝试了AcquireToken许多不同的重载,这是我可以使它工作的唯一方法.我尝试了AcquireTokenSilent,它可以在客户端应用程序中使用,因为TokenCache中有一个令牌,但是当我在WebApi中尝试时,似乎没有任何地方可以实现TokenCache.

最佳答案
的确确实有些怪异:-)请参见https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet,了解您可以通过ClaimsPrincipal检索传入令牌的方法.归结为在选项中传递TokenValidationParameters = new TokenValidationParameters {SaveSigninToken = true},然后通过以下方式从您的控制器或过滤器代码中检索

var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext; 

转载注明原文:通过使用用于AzureBearerAuthentication的JWT获取访问令牌 - 代码日志