1

フォーラムにはこの問題の例が散らばっていることに気付きましたが、実際には接続されていないイベントやタイプミスに関する唯一の解決策があります。私の問題はこれらのどちらにも関係していないと確信しています!

次のような開始タグを持つログイン コントロールがあります。

<asp:Login ID="signInControl" FailureText="Sorry, your login has not been successful" runat="server" DisplayRememberMe="false" OnLoggedIn="signInControl_LoggedIn" OnAuthenticate="signInControl_Authenticate" OnLoggingIn="signInControl_LoggingIn">

コードビハインドでの私のイベントは次のとおりです。

protected void signInControl_LoggedIn(object sender, EventArgs e)
        {
            MembershipProvider provider = Membership.Providers[GlobalConstants.MembershipProviderName];
            MembershipUser user = provider.GetUser(this.signInControl.UserName, true);

            int expiryInDays = Utility.GetConfigurationValueAsInt(SPContext.Current.Web, "PasswordExpiryLengthInDays");

            // provide a mechanism to stop password expiry (i.e. if -1);
            if (expiryInDays > 0)
            {
                expiryInDays = expiryInDays * -1;

                // If the user hasn't changed their password within the last x days, send them to update it.
                DateTime minimumPasswordChange = DateTime.Now.AddDays(expiryInDays);

                TimeSpan due = user.LastPasswordChangedDate.Subtract(minimumPasswordChange);

                Logging.LogTrace(string.Format("The user {0} next password change is in {1} days.", user.UserName, due.Days));

                if (user.LastPasswordChangedDate >= minimumPasswordChange)
                {
                    SPUtility.Redirect("/_layouts/ExpiredPassword.aspx", SPRedirectFlags.Trusted, this.Context);
                }
            }
            else
            {
                SPUtility.Redirect("/_layouts/ExpiredPassword.aspx", SPRedirectFlags.Trusted, this.Context);
            }
        }
protected void signInControl_Authenticate(object sender, AuthenticateEventArgs e)
        {
            SPClaimsUtility.AuthenticateFormsUser(new Uri(SPContext.Current.Web.Url), this.signInControl.UserName, this.signInControl.Password);
            e.Authenticated = Membership.ValidateUser(this.signInControl.UserName, this.signInControl.Password);
        }
protected void signInControl_LoggingIn(object sender, LoginCancelEventArgs e)
        {
            Logging.LogTrace(string.Format("User {0} attempting to sign in.", this.signInControl.UserName));
            e.Cancel = false;
        }

認証イベントでわかるように、e.authenticated は、ユーザーを検証できるかどうかによって設定されています。true が返されることをコードにステップインして確認しました。では、なぜ私の signInControl_LoggedIn メソッドが起動しないのでしょうか? 私は真剣に混乱しています!

これはフロントエンドのマークアップです:

助けてくれてありがとう!

カール。

4

2 に答える 2

1

SharePoint2010用の独自のカスタムログインページを作成する方法を説明する投稿がいくつかあります。 これががフォローしたものです。一般に、FormsSignInPageから継承するアプリケーションページを作成します。ルックアンドフィールを変更するだけでよいページの場合、これはうまく機能します。このように、この方法でログインページを作成するだけでは不十分な場合があります。

この投稿の最後で説明されているように、FormsSignInPageではなくIdentityModelSignInPageBaseから継承する必要があります。また、認証イベントのイベントハンドラーを作成し、これをページのOnLoadイベントに登録する必要があります。

これは、コントロールのAuthenticateメソッドが、OnLoggedInイベントを呼び出す前に、ユーザーを自動的に「ReturnUrl」ページに移動させるためです。この方法でユーザーを認証するのに必要なコードは2行だけです。

void signInControl_Authenticate(object sender, AuthenticateEventArgs e)
{
  Login signInControl = sender as Login;
  e.Authenticated = SPClaimsUtility.AuthenticateFormsUser(this.Page.Request.Url, signInControl.UserName, signInControl.Password);
}

コードはユーザーをReturnUrl値に送信しないため、OnLoggedInイベントに到達します。

カスタムAuthenticateメソッドを作成する必要があるのに、なぜOnLoggedInイベントが必要なのかと疑問に思われるかもしれません。さて、コントロールがあなたのために処理する機能はまだあります。たとえば、ユーザーが認証しない場合(つまり、UNとPWの組み合わせが正しくない場合)、コントロールはエラーメッセージを表示し、OnLoggedInは起動しません。

于 2011-08-03T17:21:04.290 に答える