2016-11-21 91 views
0

在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-管道的方法吗? 如果没有,是否有一种将附加数据保存到生成的主体索赔的好方法?

回答

0

解决我的问题非常简单。
我最初想确定tokenCaches存在与认证会话的生命周期相关联。出于某种原因,我认为将它保存到上述属性中是一个好主意。
我不会再这样做。只需将数据保存到索赔中,一切都将像魅力一样工作。