2016-11-21 95 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存在與認證會話的生命週期相關聯。出於某種原因,我認爲將它保存到上述屬性中是一個好主意。
我不會再這樣做。只需將數據保存到索賠中,一切都將像魅力一樣工作。