在AuthenticationEvents(OIDC)期间我在AuthenticationProperties中存储了一些数据,因为那是我认为它实际的地方(即,我在那里存储了Adal令牌缓存,可能会也可能不会是个好主意)。如何在索赔注册期间访问认证令牌
然后我使用声明转换,它将添加来自其他服务的用户配置文件声明。该服务将使用OAuth-Bearer-Authentication。用于承载认证所需的令牌从AuthenticationProperties检索,通过调用httpContext.Authentication.GetTokenAsync(_sharedAuthOptions.SignInScheme, tokenName);
现在最有趣的部分:GetTokenAsync()
将调用AuthenticationManager.Authenticate()
,然后将尝试运行我的要求注入,这将尝试联系服务,需要OAuth的承载令牌,这将调用GetTokenAsync()
,这将调用AuthManager.Authetnicate()
,然后将运行我要求注射等等。(StackOverflowException - 耶)
一些代码片断:
保存令牌
public static async Task<AuthenticationResult> AuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
{
var clientCred = new ClientCredential(context.Options.ClientId, context.Options.ClientSecret);
var authContext = new AuthenticationContext(context.Options.Authority, false, new TokenCache());
var result = await authContext.AcquireTokenByAuthorizationCodeAsync(context.ProtocolMessage.Code,
new Uri(context.Properties.Items[OpenIdConnectDefaults.RedirectUriForCodePropertiesKey]), clientCred, context.Options.Resource);
var authToken = SerializeCache(authContext.TokenCache);
var properties = new List<AuthenticationToken> { authToken };
context.Properties.StoreTokens(properties);
return result;
}
读令牌
await httpContext.Authentication.GetTokenAsync(_sharedAuthOptions.SignInScheme, AdalTokenCacheName);
现在的问题: 是否有访问AuthenticationProperties无需重新运行AUTH-管道的方法吗? 如果没有,是否有一种将附加数据保存到生成的主体索赔的好方法?