Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安全地将用户ID从ASP.Net传递到Javascript_Javascript_Asp.net_Forms_Authentication_Knockout.js - Fatal编程技术网

安全地将用户ID从ASP.Net传递到Javascript

安全地将用户ID从ASP.Net传递到Javascript,javascript,asp.net,forms,authentication,knockout.js,Javascript,Asp.net,Forms,Authentication,Knockout.js,在我目前开发的应用程序中,我们使用ASP.NETForms身份验证授予用户进一步访问该站点的权限。本网站面向移动用户,因此我们正试图尽可能远离服务器,利用KnockoutJS进行web服务调用并加载数据,以便用户可以查看 现在webservice(使用GET方法的REST服务)需要用户名才能加载特定于该用户的数据。我在服务器端(ASP.net)有这些信息,可以轻松访问User.Identity.Name或直接访问表单身份验证cookie并提取信息 我的问题是,我需要从服务器到客户端获取用户名,以

在我目前开发的应用程序中,我们使用ASP.NETForms身份验证授予用户进一步访问该站点的权限。本网站面向移动用户,因此我们正试图尽可能远离服务器,利用KnockoutJS进行web服务调用并加载数据,以便用户可以查看

现在webservice(使用GET方法的REST服务)需要用户名才能加载特定于该用户的数据。我在服务器端(ASP.net)有这些信息,可以轻松访问
User.Identity.Name
或直接访问表单身份验证cookie并提取信息

我的问题是,我需要从服务器到客户端获取用户名,以便可以进行服务调用。我已经研究过安全地进行这项工作,但到目前为止还是一片空白。目前,我正在将用户名作为url参数传递,并使用JavaScript对其进行解析,同时检查
Page\u Load
方法以验证url中的用户名是否与登录用户匹配

我需要一种方法来安全地将一个用户名从ASP.Net传递到客户端JavaScript,这样我就可以进行REST webservice调用,ASP.Net已经使用表单对用户进行了身份验证

编辑:所以在谷歌搜索并与我的团队负责人会面后,我认为我们将使用类似于以下示例的OAuth实现:

此外,对于寻找相同答案的其他问题,我发现这个问题对于理解OAuth非常有帮助:

假设所有内容都正确实现,那么通过下面提到的ASP标记传递生成的签名会更安全(完全安全、安全还是更不安全?)

编辑2:经过更多的审查和搜索,我们最终决定了一个框架和方法。事实证明,OAuth不一定是这里的答案,以下问题:

在弄清楚如何使这项工作起作用方面也得到了很大的帮助。我们最终要做的是生成签名,加入javascript并像这样调用。签名将是时间敏感的,每次用户加载页面时都会重新生成,非常像OAuth,但我们没有实现完整的规范


TL:DR最终的解决方案是生成一个哈希签名,并通过ASP服务器标记将其放在页面上,并使用它验证服务调用

最简单的方法是在页面中呈现此javascript:

<script type="text/javascript">
   window.UserID = '<%=HttpUtility.JavaScriptStringEncode(this.User.Identity.Name)%>';
</script>

window.UserID='';
现在您可以在JS中引用它


但是,更重要的是,如果此用户id不只是用作默认参数,而是用于对用户进行身份验证,则这是一个安全漏洞。通常,REST服务还应该能够查看
User.Identity.Name
,而不是将其作为参数接收。

通常,用户名由客户端提供。然后在服务器端对其进行验证(使用任何必要的身份验证,例如密码)

如果已经在服务器端对其进行了验证(在您的情况下,这必须来自WCF web服务,因为ASMX不能很好地处理REST),那么您可以确保它是正确的,并且您已经在客户端拥有用户名

编辑:
正如Knaģ所指出的,您可以使用ASPX标记获得它,假设该页面是ASPX页面而不是HTML。

如果您只想在客户端使用用户名,其他答案解释了如何做到这一点。
但正如你所说,这是一种安全风险。有人可以修改客户端上的数据并模拟其他用户

正确的方法是:

  • 用户成功登录后,将发出唯一标识该用户的
  • Guid是保存在客户机上并传递给服务器的令牌,而不是用户名
  • 所有Web服务都接收Guid而不是用户名
  • 服务器有一个将Guid转换为原始用户名的字典

  • 另一个选项是输入用户名并将加密值传递给Web服务。web服务需要解密该值才能获得用户名。

    该服务与用户登录的站点位于同一服务器/域上吗?是的,它们都位于同一域肯定是一个好建议,我的反问题是:有没有办法在不修改现有web服务的情况下做到这一点,如果您的Web服务只接收用户名,并且仅返回基于用户名的信息,那么您可能别无选择,因为这里存在严重的安全/设计缺陷。另一方面,无论您选择使用Guid还是加密用户名,它仍然是一个字符串值,因此不会破坏WSDL,您所要做的就是更改WebService的内部逻辑在服务器上加密,像上面所述将其传递给JS,然后在web服务中解密,怎么样?你能详细说明一下这样做的安全性吗?是的,你可以用加密来做这样的事情。但是-然后您应该确保加密的数据不会被重复使用-例如,也要加密时间戳,并且在解密时,检查时间戳是否在最后X分钟内。否则,有人可能会窃取加密的用户名一次,然后继续使用它来伪造身份验证。感谢您的帮助,这是我们最终将使用的解决方案