2016-11-24 7 views
-1

Wir haben die Anforderung, dass, wenn ein Benutzer sein Passwort vergessen hat, er ein Passwort vergessen per E-Mail anfordern und empfangen sollte, um sein Passwort zurückzusetzen.Warum funktioniert mein Datumsvergleich nicht?

Ich verwende einen Datum-Zeit-Vergleich mit einem Token in Form eines eindeutigen Codes, um ein gewisses Maß an Sicherheit zu gewährleisten.

Sobald sie einen E-Mail-Link zum Zurücksetzen des Passworts erhalten und der Benutzer auf den Link zum Zurücksetzen des Passworts klickt, wird dem Benutzer ein Bildschirm zum Zurücksetzen des Passworts angezeigt. Das funktioniert bisher großartig.

Worauf ich Probleme habe ist, wenn ein Benutzer auf den E-Mail-Link klickt, um sein Passwort mehr als 24 Stunden nach der E-Mail mit dem Link zurückzusetzen, erhalten sie eine leere Seite.

Wir möchten, dass der Benutzer eine Seite erhält, die besagt, Passwort zurücksetzen Link ist abgelaufen. Es war einmal nur, aber diese Nachricht ist nicht sichtbar.

Was mache ich falsch?

Unten ist der Code ich verwende:

If dr.HasRows Then 
    Dim dtCreate As DateTime = DateTime.Now 
    Dim dtNow As DateTime = DateTime.Now 
    Dim dtExp As DateTime = dtCreate.AddDays(1) 
    If dtNow > dtExp Then 
     ResetPwdPanel.Visible = False 
     Expired.Visible = True 
    Else 
     ResetPwdPanel.Visible = True 
     Expired.Visible = False 
     lblExpired.Text = "Reset password link has expired. It was for one time use only" 
     Return 

    End If 
End If 

‚Markup:

<form id="form1" runat="server"> 

<div> 

<asp:Panel ID="ResetPwdPanel" runat="server" Visible="false" > 

<fieldset style="width:400px"> 

<legend>Reset Password</legend>  

<table> 

<tr> 

<td>New password: </td><td> 
    <div class="input text"> 
    <asp:TextBox ID="txtNewPwd" style="width:150px;" TextMode="Password" runat="server"></asp:TextBox></div><br /> 

    <asp:RequiredFieldValidator ID="rfvNewPwd" runat="server" 

     ControlToValidate="txtNewPwd" Display="Dynamic" 

     ErrorMessage="Please enter new password" ForeColor="Red" SetFocusOnError="True"></asp:RequiredFieldValidator> 

    </td> 

</tr> 

<tr> 

<td>Confirm Passsword: </td><td> 
<div class="input text"> 
    <asp:TextBox ID="txtConfirmPwd" style="width:150px;" TextMode="Password" runat="server"></asp:TextBox></div><br /> 

    <asp:RequiredFieldValidator ID="rfvConfirmPwd" runat="server" 

     ControlToValidate="txtConfirmPwd" Display="Dynamic" 

     ErrorMessage="Please re-enter password to confirm" ForeColor="Red" 

     SetFocusOnError="True"></asp:RequiredFieldValidator> 

    <asp:CompareValidator ID="cmvConfirmPwd" runat="server" 

     ControlToCompare="txtNewPwd" ControlToValidate="txtConfirmPwd" 

     Display="Dynamic" ErrorMessage="Password didn't match" ForeColor="Red" 

     SetFocusOnError="True"></asp:CompareValidator> 

    </td> 

</tr> 

<tr> 

<td> 

    &nbsp;</td><td> 

    <asp:Button ID="btnChangePwd" runat="server" Text="Change Password" 

      onclick="btnChangePwd_Click" /></td> 

</tr> 

    <tr> 

     <td colspan="2"> 

      <asp:Label ID="lblStatus" runat="server" Text=""></asp:Label> 

     </td> 

    </tr> 

</table> 

</fieldset>   

</asp:Panel> 

<asp:panel ID="Expired" runat="server"> 
    <asp:Label ID="lblExpired" runat="server" Text="" style="color: #FF0000"></asp:Label></asp:panel> 

Wir haben zwei Bedienelemente. Eine, die Reset-Passwort-Kontrollen zeigt (funktioniert), während die andere zeigt die Reset-Passwort-Link-Ablaufmeldung (das funktioniert nicht).

+0

ein leerer Bildschirm ist nicht sehr hilfreich. Da gibt es immer mehr Informationen. In IIS-Protokollierung, F12-Tools, interaktives Debugging. Machen Sie den ersten Schritt zur Lösung Ihres Problems und sehen Sie sich das Ergebnis des leeren Bildschirms an. –

+0

@Tairoc: Es kann hilfreich sein, wenn Sie ein Snippet der ASPX-Datei hinzugefügt haben, das das Markup für Ihre Panels und deren übergeordnete Steuerelemente anzeigt. Mit "leere Seite" meinst du auch einen weißen Bildschirm ohne irgendeinen * Inhalt, oder meinst du nur, dass die Ablaufmeldung nicht sichtbar ist? –

+4

'dtNow> dtExp' kann niemals basierend auf Ihrem Code wahr sein –

Antwort

1

wenn noch mehr als 24 Stunden ist das Szenario dann das tun Equal or =

wie diese

If DateOfCreation = DateTime.Now then 

    msgbox "Reset" 
else 
     msgbox "Expired" 
End if 

basierend auf Ihren Code

If dr.HasRows Then 
       Dim dtCreate As DateTime = DateTime.Now 
       Dim dtNow As DateTime = DateTime.Now 

       If dtCreate = dtNow Then 


ResetPwdPanel.Visible = True 
        Expired.Visible = False 
        Return 
       Else 
         ResetPwdPanel.Visible = False 
        Expired.Visible = True 

       End If 
      End If 
+0

Sorry, das stimmt nicht mit dir überein, aber die Verwendung des Ausdrucks <> funktioniert nicht. dtNow ist entweder größer (>) als dtExpt oder dtNow ist kleiner als (<). – Tairoc

+0

versuchen, 'grether than' nur' <' –

+0

pls zu verwenden, sehen Sie die aktualisierte Antwort –