ADB2C-令牌缓存​​过期时,处理“在AcquiretokenSilent API中传递了空用户”错误

时间:2019-01-24 14:12:32

标签: c# asp.net-core azure-ad-b2c

我已经设法将我的应用程序配置为使用ADB2C进行身份验证,并且看起来工作正常。实现的ADB2C代码是Microsoft示例之一的改进,在这些示例中,他们使用SessionTokenCache类来管理TokenCache的实例。在我的应用程序中,我按以下方式检索访问令牌:

cv2.imshow(windowName, displayBuf)
cv2.waitKey(0)

此方法用于获取访问令牌,并将其传递到HttpClient的请求标头中,如下所示:

private async Task<string> _getAccessToken(IConfidentialClientCredentials credentials)
        {
            if (this.HasCredentials())
            {
                var clientCredential = new ClientCredential(credentials.ClientSecret);
                var userId = this._getUserIdClaimValue();

                var tokenCache = new SessionTokenCache(_httpContextResolver.Context, userId);                

                var confidentialClientApplication = new ConfidentialClientApplication(
                    credentials.ClientId,
                    credentials.Authority,
                    credentials.RedirectUri,
                    clientCredential,
                    tokenCache.GetInstance(),
                    null);

                IAccount account = confidentialClientApplication.GetAccountsAsync().Result.FirstOrDefault();
                if (account == null)
                {
                    return "";
                }

                var authenticationResult = await confidentialClientApplication.AcquireTokenSilentAsync(
                    credentials.ApiScopes.Split(' '),
                    account,
                    credentials.Authority,
                    false);

                return authenticationResult.AccessToken;
            }
            else
            {
                return "";
            }
        }

问题在于,重新启动应用程序时,用户仍通过ADB2C cookie进行身份验证,但是... using (var request = new HttpRequestMessage(HttpMethod.Get, address.AbsoluteUri)) { if (this.HasCredentials()) { string accessToken = await this._getAccessToken(_confidentialClientCredentials); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); } using (HttpResponseMessage response = await this.SendAsync(request)) { //result-processing logic } ... 返回null。这可能是因为令牌缓存在应用程序重启时被破坏了,所以我可能可以使用Redis缓存进行修复。

但是,我的主要问题是如何处理具有空帐户但同时被“认证”的情况。即使我有一个空帐户,如何验证对我的网站的请求?例如,它是否应该失败并重定向到登录页面?

我尝试查看“授权”过滤器,并使用以下代码连接到auth进程,并验证那里的用户是否为null,但无济于事。永远不会调用以下事件(在ConfigureServices中):

confidentialClientApplication.GetAccountsAsync().Result.FirstOrDefault();

对于我来说,一切都太抽象了,无法理解正在发生的事情。要么是这样,否则我会缺少一些基本知识。

注意:错误“ 在AcquiretokenSilent API中传递了空用户。传递用户对象或调用acquireToken进行身份验证。 如果我尝试将空帐户传递给services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme) .AddAzureADB2C(options => Configuration.Bind("ActiveDirectoryB2C", options)) .AddAzureADB2CBearer(options => Configuration.Bind("ActiveDirectoryB2C", options)) .AddCookie((options) => new CookieAuthenticationOptions { Events = new CookieAuthenticationEvents { OnValidatePrincipal = context => { // context.Principal gives you access to the logged-in user // context.Properties.GetTokens() gives you access to all the tokens return Task.CompletedTask; }, OnSignedIn = context => { return Task.CompletedTask; } } }); 方法,则会引发“”。

1 个答案:

答案 0 :(得分:0)

我用以下代码解决了

protected override void OnException(ExceptionContext filterContext)
{
 if (filterContext.Exception is Microsoft.Identity.Client.MsalUiRequiredException)
 {
   RedirectToAction("SignIn", "Account");
 }
 else {
    //Do your logging
    // ...
 }
}

我将寻找更好的解决方案。