Web アプリケーションがフォーム ベース認証 (FBA) を使用する SharePoint 実装があります。
ファームには 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 秒のログイン時間は、デフォルトの共有ポイントの fba ページ (/_forms/default.aspx) でも発生します。
- スタンドアロンの開発マシンでは発生しません。
私にとって、これはボトルネックがネットワークに関連していることを示しています。
どんな助けでも大歓迎です。