【问题标题】:Trigger confirmation message box during asp.net LoggingIn event在 asp.net LoggingIn 事件期间触发确认消息框
【发布时间】:2013-06-11 13:48:22
【问题描述】:

我在 vb 中有一个 Web 应用程序,我在其中使用 this approach 来防止用户由于简单的许可协议而同时登录。

效果很好,如果用户使用已在使用的帐户登录,则第一个用户会被注销。我正在尝试在登录事件中添加一个消息框或某种 js 确认框:

This user account has been active in the last 20 minutes.
If someone else is using it, then logging in may possibly
compromise any report generation or activity.
Continue login?

代码如下:

<asp:Login ID="Login1" runat="server"  DestinationPageUrl="~/Dashboard/Default.aspx" >
    <LayoutTemplate>
        <table border="0" cellpadding="0">
            <tr>
                <td align="right"><p><asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">User Name:</asp:Label></p></td>
                <td align="right">
                    <p><asp:TextBox ID="UserName" runat="server" Width="220" autocomplete="on" />
                    <asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName" Text="*"
                        ErrorMessage="User Name is required." ToolTip="User Name is required." ValidationGroup="Login1" /></p>
                </td>
            </tr>
            <tr>
                <td align="right"><p><asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">Password:</asp:Label></p></td>
                <td align="right">
                    <p><asp:TextBox ID="Password" runat="server" TextMode="Password" Width="220"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="Password" Text="*"
                        ErrorMessage="Password is required." ToolTip="Password is required." ValidationGroup="Login1" /></p>
                </td>
            </tr>
            <tr>
                <td align="center" colspan="2" style="color: red"><asp:Literal ID="FailureText" runat="server" EnableViewState="False"></asp:Literal></td>
            </tr>
            <tr>
                <td align="right" colspan="2"><asp:LinkButton CssClass="prettyButton" ID="LoginButton" runat="server" CommandName="Login" Text="Log In" ValidationGroup="Login1"  /></td>
            </tr>
        </table>
    </LayoutTemplate>
</asp:Login>

Private Sub Login1_LoggingIn(sender As Object, e As LoginCancelEventArgs) Handles Login1.LoggingIn

        Dim messagetext As String = "This user account has been active in the last 20 minutes." + Environment.NewLine + Environment.NewLine
        messagetext += "If someone else is using it, then logging in may possibly" + Environment.NewLine
        messagetext += "compromise any report generation or activity." + Environment.NewLine + Environment.NewLine
        messagetext += "Continue login?"

        Dim userNameTextBox As System.Web.UI.WebControls.TextBox = DirectCast(Login1.FindControl("UserName"), System.Web.UI.WebControls.TextBox)
        Dim currentUser As MembershipUser = Membership.GetUser(userNameTextBox.Text)

        If currentUser IsNot Nothing Then
            If currentUser.IsOnline Then

             '*****CONFIRMATION MESSAGE BOX TO GO HERE*****/
             Dim result = MessageBox.Show(messagetext , "Login Warning", MessageBoxButtons.YesNo)

             '* IF USER DECIDES NOT TO LOGIN:*/
             If result = DialogResult.No Then
                e.Cancel = True
             End If

             '* ELSE LOGIN CONTINUES AND ORIGINAL USER IS LOGGED OUT*/
            End If
        End If
    End Sub

Private Sub Login1_LoggedIn(sender As Object, e As EventArgs) Handles Login1.LoggedIn
        Dim userNameTextBox As System.Web.UI.WebControls.TextBox = DirectCast(Login1.FindControl("UserName"), System.Web.UI.WebControls.TextBox)
        SingleSessionPreparation.CreateAndStoreSessionToken(userNameTextBox.Text)
    End Sub

现在,我可以在本地使用Windows 窗体msgbox(),一切正常,但是一旦我将它放在服务器上,消息框显然不起作用。我试过ClientScriptScriptManager,但客户端检查似乎没有被触发。

非常感谢任何帮助。

【问题讨论】:

    标签: asp.net vb.net authentication


    【解决方案1】:

    不要在网站中使用 VB MessageBox。它只会显示在服务器上 - 并且很可能每次都会杀死您的页面。最终用户永远不会在他的浏览器上看到它。

    您可以通过多种方式来处理您想要实现的目标,但效果很好的一种方法是向用户显示 javascript confirm 框;这或多或少与消息框相同,但有一个 OKCancel 按钮。

    您可以通过在页面呈现时向您的页面注入一点 javascript 来向用户展示它。因此,删除您的 Dim result.... 行并将其替换为以下内容: - 这会将一些 javascript 注入您的页面 HTML。

    Dim cs As ClientScriptManager = Page.ClientScript
    cs.RegisterStartupScript(Me.GetType(), "userChecker", "UserCheck(Confirm('yourMessage'));", True)
    

    注意 - 您还将删除检查对话框的代码,即 If result = ....

    当页面加载时,confirm 对话框将会出现。在这种情况下,捕获的响应将被传递给一个名为 UserCheckjavascript 函数 - 因此在您的 HTML 中有一个 javascript 函数来接受它。像这样的:

    function UserCheck(t){
    
        if (t){
           // do something for OK
        }else{
          // do something for CANCEL
    
    }
    

    UserCheck 中,您可以轻松处理用户的响应。可能是通过重定向,或者通过调用 .Net 的 __doPostBack 函数引起回发。

    【讨论】:

    • 谢谢。你知道,我无法让任何javascriptLogin1_LoggingIn 中工作,除非我设置e.Cancel = True,从而取消登录。是否可以在 UserCheck 函数中反转它?
    • 我实际上想出了一个不同的方法,因为这花了我太长时间。不过感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多