【发布时间】: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