Аутентификация на основе форм в SharePoint 2013 медленная - почему SetPrincipalAndWriteSessionToken занимает 20 секунд или более?

У нас есть реализация SharePoint, в которой наше веб-приложение использует проверку подлинности на основе форм (FBA).

В ферме 2 сервера. Веб-интерфейсный сервер, который находится в демилитаризованной зоне и сервер SQL в корпоративной сети. Брандмауэр разделяет их.

Мы используем аутентификацию SQL.

Нам нужно заставить пользователя сменить пароль после первого успешного входа в систему. Поэтому мы создали специальную форму для входа в FBA на основе следующей статьи. ( https://sharepoint.stackexchange.com/questions/42541/how-to-create-a-custom-fba-login-page-that-forces-user-to-change-password-and-vi).

Код в вопросе:

private void SignInUser()
{
        SecurityToken token = SPSecurityContext.SecurityTokenForFormsAuthentication
                                                 (new Uri(SPContext.Current.Web.Url),
                                                  GetMembershipProvider(SPContext.Current.Site),
                                                  GetRoleProvider(SPContext.Current.Site),
                                                 _userName,
                                                 _password, SPFormsAuthenticationOption.None);
        SPFederationAuthenticationModule fam = SPFederationAuthenticationModule.Current;           
        fam.SetPrincipalAndWriteSessionToken(token, SPSessionTokenWriteType.WriteSessionCookie);
        SPUtility.Redirect(System.Web.Security.FormsAuthentication.DefaultUrl,
        SPRedirectFlags.UseSource, this.Context);                
}  

public static string GetMembershipProvider(SPSite site)
{
        // get membership provider of whichever zone in the web app fba isenabled 
        SPIisSettings settings = GetFbaIisSettings(site);
        if (settings == null) return null;
        return settings.FormsClaimsAuthenticationProvider.MembershipProvider;
}

public static string GetMembershipProvider(SPSite site)
{
        // get membership provider of whichever zone in the web app is fba enabled 
        SPIisSettings settings = GetFbaIisSettings(site);
        if (settings == null) return null;
        return settings.FormsClaimsAuthenticationProvider.MembershipProvider;
} 

Код, который занимает время:

fam.SetPrincipalAndWriteSessionToken(token, SPSessionTokenWriteType.WriteSessionCookie);Из моего понимания эта строка кода делает следующее:

  1. Вызывает метод OnSessionSecurityTokenCreated, чтобы вызвать событие SessionSecurityTokenCreated
  2. Вызывает метод AuthenticateSessionSecurityToken в SPFederationAuthenticationModule.Current, чтобы установить участника потока, а затем записать файл cookie сеанса.

Некоторые другие моменты, на которые следует обратить внимание:

  1. Это 20-секундное время входа также происходит для страницы fba sharepoint по умолчанию (/_forms/default.aspx)
  2. Это не происходит на автономной машине разработчика.

Для меня это означает, что узкое место связано с сетью.

Любая помощь приветствуется.

1 ответ

Мне удалось сократить время входа в систему примерно на 13 секунд, разрешив следующую запись в журнале ULS.

30.03.2016 11:08:53.71 w3wp.exe (0x2448) 0x1148 Топология SharePoint Foundation 8321 Критическое Операция проверки сертификата заняла 23141,9482 миллисекунды и превысила порог времени выполнения. Если это продолжает происходить, это может представлять проблему конфигурации. Пожалуйста, смотрите http://go.microsoft.com/fwlink/?LinkId=246987 для более подробной информации. bc926d9d-52af-f0fb-b2ae-236a27cd54f1

Таким образом, SharePoint использует сертификаты для подписи маркеров безопасности, которые выдаются службой маркеров безопасности (STS). Как и все сертификаты, срок действия сертификата STS необходимо периодически проверять, чтобы убедиться, что сертификат не был отозван. По умолчанию корневой сертификат в цепочке не добавляется в хранилище доверенных корневых центров сертификации серверов SharePoint. Из-за этого проверка списка отзыва сертификатов (CRL) для сертификата выполняется через Интернет, что невозможно на нашем сервере WFE.

Я решил эту проблему, экспортировав корневой сертификат на сервере WFE, используя

$rootCert = (Get-SPCertificateAuthority).RootCertificate $rootCert.Export("Cert") | Set-Content C:\SharePointRootAuthority.cer -Байт кодирования

Затем импортируйте сертификат в хранилище доверенных корневых центров сертификации с помощью оснастки mmc.

Другие вопросы по тегам