在AuthenticationEvents(OIDC)期间,我将一些数据存储在AuthenticationProperties中,因为那是我认为实用的地方(即我在那里存储了Adal Token Cache,这可能是也可能不是一个好主意)。
然后我使用声明转换,它将添加来自其他服务的用户个人资料声明。该服务将使用OAuth-Bearer-Authentication。通过调用httpContext.Authentication.GetTokenAsync(_sharedAuthOptions.SignInScheme, tokenName);
现在有趣的部分:GetTokenAsync()
将调用AuthenticationManager.Authenticate()
,然后尝试运行我的索赔注入,它将尝试联系需要oAuth-Bearer-Token的服务,调用GetTokenAsync()
,它将调用AuthManager.Authetnicate()
,然后运行我的索赔注释等。(StackOverflowException - yay)
一些代码段:
保存令牌
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-pipeline? 如果没有,是否有一个很好的方法可以将额外的数据保存到生成的主要索赔中?
答案 0 :(得分:0)
解决我的问题非常简单 我原本想确保,tokenCaches存在与认证会话的生命周期相关联。出于某种原因,我认为将其保存到上述属性中是个好主意 我不会再这样做了。只需将数据保存到声明中,一切都会像魅力一样。