2013-10-28 1 views
0

사용자가 제공 한 대답이 정확하지 않은 경우에도 항상 암호를 다시 설정하는 PasswordRecovery 컨트롤로 작업하고 있습니다. "OnAnswerLookupError"이벤트가 발생하지 않는 것 같습니다. 누구도이 문제에 뛰어 들어 본적이 있습니까?ASP.NET PasswordRecovery 컨트롤 - 잘못된 대답이 제공된 경우에도 항상 "성공"?

아주 간단한 코드입니다. 아래에 붙여 넣습니다. 문제는 거의 확실히 당신이 마스터 페이지를 사용하고 있기 때문에 될 것입니다

<%@ Page Title="Password Recovery" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" 
    CodeBehind="PasswordRecovery.aspx.cs" Inherits="OurApp.UI.Account.PasswordRecovery" %> 

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
</asp:Content> 
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 

    <h2> 
     Password Recovery 
    </h2> 
    <p> 
     Follow instructions to reset your password. 
    </p> 

    <asp:Label ID="lblMessage" runat="server" Font-Bold="true" ForeColor="red" /> 

    <asp:PasswordRecovery SuccessText="Your password was successfully reset and emailed to you." 
     OnAnswerLookupError="UserLookupError" 
     OnUserLookupError="UserLookupError" 
     OnVerifyingUser="UserCheck" 
     QuestionFailureText="Incorrect answer. Please try again." runat="server" ID="RecoveryInput" 
     UserNameFailureText="Username not found." 
     OnSendingMail="RecoveryInput_SendingMail"> 

    <MailDefinition IsBodyHtml="false" BodyFileName="~/Account/email.ascx" 
      From="[email protected]" 
      Subject="Our App - Password Reset" 
      Priority="High"> 
    </MailDefinition> 

    <UserNameTemplate> 
     <asp:Panel ID="pnl1" runat="server" DefaultButton="submit"> 
     <dl> 
      <dd>User Name</dd> 
      <dd> 
       <asp:TextBox ID="Username" runat="server" AUTOCOMPLETE="OFF" /> 
      </dd> 
      <dt></dt> 
      <dd> 
       <asp:Button ID="submit" 
        CausesValidation="true" 
        ValidationGroup="PWRecovery" 
        runat="server" 
        CommandName="Submit" 
        Text="Submit" /> 
      </dd> 
      <dt></dt> 
      <dd> 
       <p class="Error"><asp:Literal ID="ErrorLiteral" 
         runat="server"></asp:Literal> 
       </p> 
      </dd> 
     </dl> 
     </asp:Panel> 
    </UserNameTemplate> 
    <QuestionTemplate> 
     <asp:panel ID="pnl1" runat="server" DefaultButton="submit"> 
     Hello 
     <asp:Literal runat="server" ID="personname" />, 
     <p> 
      You must answer your recovery question in order to have a new email sent to you. 
     </p> 
     <dl> 
      <dt>Question:</dt> 
      <dd> 
       <asp:Literal runat="server" ID="Question" /> 
      </dd> 
      <dt></dt> 
      <dt>Answer:</dt> 
      <dd> 
       <asp:TextBox runat="server" ID="Answer" AUTOCOMPLETE="OFF" /> 
      </dd> 
      <dt></dt> 
      <dd> 
       <asp:Button runat="server" ID="submit" 
        Text="Submit" CommandName="submit" /> 
      </dd> 
      <dt></dt> 
      <dd> 
       <p class="Error"> 
        <asp:Literal ID="FailureText" runat="server"></asp:Literal> 
       </p> 
      </dd> 
     </dl> 
     </asp:panel> 
    </QuestionTemplate> 
</asp:PasswordRecovery> 
<asp:HyperLink NavigateUrl="~/Account/Login.aspx" runat="server">Login</asp:HyperLink> 
</asp:Content> 


    public partial class PasswordRecovery : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      lblMessage.Text = string.Empty; 
     } 

     protected void UserCheck(object sender, EventArgs e) 
     { 
      MembershipUser mu = Membership.GetUser(RecoveryInput.UserName); 

      if (mu == null) 
      { 
       UserLookupError(sender, e); 
       return; 
      } 

      if (mu.IsLockedOut) 
      { 
       //UserLookupError(sender, e); 
       //return; 
       mu.UnlockUser(); 
      } 
     } 

     protected void UserLookupError(object sender, EventArgs e) 
     { 
      lblMessage.Text = "There was a problem resetting your password. Please contact your Administrator or Account Executive for assistance."; 
     } 

     protected void RecoveryInput_SendingMail(object sender, MailMessageEventArgs e) 
     { 
      try 
      { 
       MembershipUser mu = Membership.GetUser(RecoveryInput.UserName); 
       mu.Comment = "MustChangePassword"; 
       Membership.UpdateUser(mu); 
      } 
      catch (Exception ex) 
      { 
       Utilities.ErrorHandling.HandleError(ex); 
       lblMessage.Text = "There was a problem resetting your password. Please contact your administrator."; 
      } 
     } 
    } 

답변

0

업데이트 : 이것은 SqlMembershipProvider의 내부 구현으로 인해 발생했으며 aspnet_Membership_ResetPassword 저장 프로 시저의 반환 코드를 캡처하지 못했습니다. ASP.NET 자체에는 문제가 없습니다. 우리가이 저장된 proc (양파의 레이어를 생각해라)에 접근해야하는 방식 때문에 - 그것은 나에게 명백하지 않았다. 이 질문은 닫을 수 있습니다!

+0

당신이 해결책을 찾았다면 다행이다! – Icemanind

2

:이있어 유일한 정의는 잠겨있는 사용자가 (우리의 클라이언트로부터 요청에 따라) 자신의 암호를 리셋시키는 것입니다. 이 페이지를 마스터 페이지없이 자체 페이지에 넣고 다시 시도하면 제대로 작동합니다.

+0

나는이 컨트롤에 문제가있는 마스터 페이지에 관한 내용을 읽었으며 실제로 질문을 게시하기 전에 정확하게 시도를 마쳤습니다. 불행히도 완전히 빈 페이지 (form 태그에서이 마크 업과 함께)에서도 동일한 동작을 보입니다. : – Cortright

+0

@Cortright - [이 페이지] (http://forums.asp.net/t/1331916.aspx)에서 도움이되는지 확인해보십시오.이 페이지의 OP에는 – Icemanind

+0

아니, 나는 그것을 시도했다. 아무것도 해결하지 못했다. – Cortright

관련 문제