0

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

这是异常详细信息的屏幕截图。

经过分析,我们发现 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;
        }
    }

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

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

4

0 回答 0