Аутентификация на основе форм в 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);
Из моего понимания эта строка кода делает следующее:
- Вызывает метод OnSessionSecurityTokenCreated, чтобы вызвать событие SessionSecurityTokenCreated
- Вызывает метод AuthenticateSessionSecurityToken в SPFederationAuthenticationModule.Current, чтобы установить участника потока, а затем записать файл cookie сеанса.
Некоторые другие моменты, на которые следует обратить внимание:
- Это 20-секундное время входа также происходит для страницы fba sharepoint по умолчанию (/_forms/default.aspx)
- Это не происходит на автономной машине разработчика.
Для меня это означает, что узкое место связано с сетью.
Любая помощь приветствуется.
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.