使用用于 AzureBearerAuthentication 的 JWT 获取访问令牌
Acquiring an Access token by using JWT used for AzureBearerAuthentication
我有一个 WebApi 应用程序正在使用 Windows Azure Active Directory Bearer Authentication 来对用户进行身份验证。用户通过身份验证后,我想查询 Azure 的 Graph Api 以获取有关用户的更多信息。
我有一个可行的解决方案,但看起来很老套。我阅读了授权 header 并删除了不记名部分,然后我使用 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 中有一个令牌,但是当我在 Web 中尝试时Api,似乎没有任何地方可以实现 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;
我有一个 WebApi 应用程序正在使用 Windows Azure Active Directory Bearer Authentication 来对用户进行身份验证。用户通过身份验证后,我想查询 Azure 的 Graph Api 以获取有关用户的更多信息。
我有一个可行的解决方案,但看起来很老套。我阅读了授权 header 并删除了不记名部分,然后我使用 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 中有一个令牌,但是当我在 Web 中尝试时Api,似乎没有任何地方可以实现 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;