我们有一个 SharePoint 实现,其中我们的 Web 应用程序使用基于表单的身份验证 (FBA)。
场中有 2 台服务器。位于 DMZ 中的 Web 前端服务器和企业网络中的 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 事件
- 调用 SPFederationAuthenticationModule.Current 上的 AuthenticateSessionSecurityToken 方法来设置线程主体,然后写入会话 cookie。
其他一些需要注意的点是:
- 这 20 秒的登录时间也发生在默认的 sharepoint fba 页面 (/_forms/default.aspx)
- 它不会发生在独立的开发机器上。
对我来说,这表明瓶颈与网络有关。
任何帮助将非常感激。