使用用于AzureBearerAuthentication的JWT获取Access令牌

时间:2015-08-18 21:42:27

标签: authentication asp.net-web-api owin jwt azure-active-directory

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

我有一个有效的解决方案,但似乎非常hacky。我阅读了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。

1 个答案:

答案 0 :(得分:6)

确实有些hacky :-)请参阅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;