【问题标题】:Enabling secondary user accounts in a web software在 Web 软件中启用辅助用户帐户
【发布时间】:2015-01-18 07:02:37
【问题描述】:

在确定可以实施之前,我的规范需要做一些工作。我很高兴听到有关以下情况的 cmets 和建议:

我需要一个用户登录的网络软件。所有用户都有一个用户帐户,并且可以有 0-3 个辅助用户帐户,他们可以在经过身份验证后通过主网站使用这些帐户。辅助用户帐户由第三方 javascript 库控制,但我可以控制存储在数据库中的用户名和密码。

目标是让用户不必多次验证,只使用一个用户帐户,其他帐户应该通过脚本自动工作。

那么,有没有一种可行、安全和适当的方法来实现这一点?我知道在脚本中使用用户名和密码本身就是一个安全问题,但如果不能正确完成,我希望我能找到下一个最好的方法。我将使用 Asp.Net MVC 作为平台,所有调用都使用 ajax,因此该软件的外观和感觉就像一个单页应用程序。底层技术无关紧要,任何服务器端技术都可以在这里使用。

有一些选项可以玩:

  • 基本上我可以使用任何用户名和密码进行身份验证,只是要比较哪些表中的哪些字段
  • 我可以强制所有用户帐户的密码相同,这样用户就不必记住/使用很多密码
  • 我可以在登录调用中从 db 中检索辅助用户名,以便网站可以访问辅助用户名,但显然我不能对密码执行此操作,因为它们在 db 中进行了散列/加盐处理

这是我一直在玩弄的一个想法:

首先显示一个登录页面。身份验证是通过 ajax 完成的,凭据保存在登录表单中,当用户登录时会隐藏。在登录调用的成功回调事件中,我们可以显示 ajax 调用可以返回的主要内容(这可能类似于已验证用户的主页。由于原始凭据字段仍在页面上,因此可以通过脚本访问它们并用作辅助系统凭据。

但是,我不相信这是处理辅助系统登录的安全方法,即使我可以在整个站点中使用 https。我只是不知道这里的实际安全问题是什么。评论,专家?更好的方法来完成同样的事情?

登录页面和主要结构可能如下所示(一个非常简单的示例):

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <script type="text/javascript" src="/Scripts/jquery-2.1.0.min.js"></script>
    <script type="text/javascript">
        function VerifyUser(name, pass, remember, container) {
            $.ajax({
                type: 'POST',
                contentType: 'application/json; charset=UTF-8',
                url: 'Account/VerifyUser',
                data: JSON.stringify({ "userid": name, "password": pass }),
                processData: false,
                success: function (response) {
                    if (response.Success) {
                        // Here I could stash the password somewhere if needed. 
                        // It's not visible in the source code but it is accessible via jquery
                        $('#secondarypass').val(pass);

                        // Here I can show the html data that the ajax call could return, or
                        // send out another ajax call to retrieve the actual content separately.

                        //Show here data that was returned by ajax call in response object. This could be a main page etc
                        $("#maincontainer").show();
                        $("#maincontainer").html(response.Message); 
                        $("#logincontainer").hide();
                    }
                },
                error: function (a, b, c) {
                    $("#maincontainer").show();
                    $("#maincontainer").html(a.responseText);
                }
            });
            return false;
        }
    </script>
</head>
<body>
    <div class="page">
        <input id="secondarypass" type="password" />

        <div id="logincontainer">
            <input id="UserName" name="UserName" type="text" value="" />
            <input id="Password" name="Password" type="password" />
            <button onclick="javascript:VerifyUser($('#UserName').val(), $('#Password').val());">Log In</button>
        </div>
        <div id="message"></div>
        <div id="maincontainer">
            <!-- this is where the main content of the software would be -->
        </div>
    </div>
</body>
</html>

而 ajax 调用可能会返回类似这样的内容

<script type="text/javascript" src="/Scripts/secondarysystem.js"></script>
<script type="text/javascript">
    function SecondaryLogin() {
        var data = {
            'username': 'mysecondaryusername',
            'pass': $("#secondarypass").val()   //NOTE here I could access the password-stash I set up earlier
        };

        var system = new SecondarySystem(); //This could be an object from the secondarysystem.js library
        system.LogIn(data);
        // this could have a onsuccessfullogin callback event, where we could populate some secondary system specific data to the div below
    }
</script>

<div id="secondarycontainer">
</div>

在此设置中,页面刷新会导致问题,但我可以禁用 f5(或将其替换为重新加载正确的内容)并至少添加一个对话框,说明“刷新将强制您重新登录,请务必离开此页面?”等等

【问题讨论】:

    标签: javascript jquery ajax security authentication


    【解决方案1】:

    您一直在玩弄的想法听起来不错,我们中的许多人都在实践。您提到的问题很少是您不想面对的,如果您真的要将其作为单页应用程序,请记住以下几点。

    1.刷新F5

    如果刷新是您的问题,您可能可以使用 localstorage,这样您的用户名和密码就不会在页面刷新时丢失。

    1. 安全吗?

    我认为您可以加密存储密码变量,以便仅在需要对用户进行身份验证时对其进行解密。加密可以参考https://sourceforge.net/projects/pidcrypt/(网址更新)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2022-01-02
      • 2017-08-09
      • 2016-07-15
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多