AADSTS70002:验证凭据时出错。 AADSTS50013:断言不在其有效时间范围内。使用WinDbg在内存转储中出错

时间:2016-12-06 13:21:24

标签: windbg access-token memory-dump

最近我们有一个普通的Windows应用商店的生产部署。它工作正常几天,几天后表现非常缓慢。我们的应用程序遵循Gate keeper模式,其中商店应用程序击中守门员和守门员以休息服务和休息服务到数据库(一切都托管在云中)。

Here is a screenshot of exception details.

经过分析,我们发现Gatekeeper Web应用程序需要更多时间来响应。我们已经为Web应用程序进行了内存转储并使用WinDbg进行了分析,并发现了AAD访问令牌的问题,其中锁定计数为2.并附加了内存转储的结果。

以下是获取访问令牌的实际代码(我们使用基于证书的身份验证)

    public static void GetCert()
    {
        try
        {
            var clientAssertionCertPfx = Helper.FindCertificateByThumbprint(WebConfigurationManager.AppSettings["CertificateThumbPrint"]);
            AssertionCert = new ClientAssertionCertificate(WebConfigurationManager.AppSettings["ida:ClientID"], clientAssertionCertPfx);
        }
        catch (Exception ex)
        {

            throw ex;
        }

    }

    public static async Task<string> GetAccessToken(string authority, string resource, string scope)
    {
        try
        {               
            string userName = "";
            GetCert();
            var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
            AuthenticationResult result = null;
            var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext;
            if (bootstrapContext != null)
            {
                userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;

                if (!string.IsNullOrEmpty(bootstrapContext.Token))
                {
                    UserAssertion userAssertion = new UserAssertion(bootstrapContext.Token, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);
                    AuthenticationContext authContext = new AuthenticationContext(authority);
                    result = await authContext.AcquireTokenAsync(resource, AssertionCert, userAssertion);
                    return result != null ? result.AccessToken : null;
                }
                return null;
            }
            else
            {
                return null;
            }                
        }
        catch (Exception ex)
        {
            LogErrorDetails objLogDetails = new LogErrorDetails();
            ErrorLog objErrorLog = new ErrorLog();
            objLogDetails.ErrorDescription = ex.Message;
            objLogDetails.ErrorNumber = ex.HResult;
            objLogDetails.strErrorContext = "Helper";
            objLogDetails.strErrorContextArea = "GetAccessToken";
            objLogDetails.strTrace = ex.StackTrace;
            await objErrorLog.InsertErrorLog(objLogDetails);
            return null;
        }
    }

在本地运行此代码时,我们没有遇到访问令牌的任何问题,而且速度很快。仅在生产环境中,性能非常慢,并且不确定它是否具有访问令牌或任何其他参数。

您能否帮助我们分析我们的代码出了什么问题。

0 个答案:

没有答案