1

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

效果很好,如果用户使用已在使用的帐户登录,则第一个用户将被注销。我正在尝试在登录事件中添加一个消息框或某种 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(),一切正常,但是一旦我把它放在服务器上,消息框显然不起作用。我试过ClientScriptand ScriptManager,但客户端检查似乎没有被触发。

任何帮助是极大的赞赏。

4

1 回答 1

1

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

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

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

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

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

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

function UserCheck(t){

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

}

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

于 2013-06-11T13:59:56.477 回答