如何在索赔注入期间访问身份验证令牌

时间:2016-11-21 10:43:19

标签: asp.net asp.net-core

在AuthenticationEvents(OIDC)期间,我将一些数据存储在AuthenticationProperties中,因为那是我认为实用的地方(即我在那里存储了Adal Token Cache,这可能是也可能不是一个好主意)。

然后我使用声明转换,它将添加来自其他服务的用户个人资料声明。该服务将使用OAuth-Bearer-Authentication。通过调用httpContext.Authentication.GetTokenAsync(_sharedAuthOptions.SignInScheme, tokenName);

,从AuthenticationProperties中检索承载身份验证所需的令牌

现在有趣的部分: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? 如果没有,是否有一个很好的方法可以将额外的数据保存到生成的主要索赔中?

1 个答案:

答案 0 :(得分:0)

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