安全地将用户ID从ASP.Net传递到Javascript
在我目前开发的应用程序中,我们使用ASP.NETForms身份验证授予用户进一步访问该站点的权限。本网站面向移动用户,因此我们正试图尽可能远离服务器,利用KnockoutJS进行web服务调用并加载数据,以便用户可以查看 现在webservice(使用GET方法的REST服务)需要用户名才能加载特定于该用户的数据。我在服务器端(ASP.net)有这些信息,可以轻松访问安全地将用户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并提取信息 我的问题是,我需要从服务器到客户端获取用户名,以
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。如果您只想在客户端使用用户名,其他答案解释了如何做到这一点。
但正如你所说,这是一种安全风险。有人可以修改客户端上的数据并模拟其他用户 正确的方法是:
另一个选项是输入用户名并将加密值传递给Web服务。web服务需要解密该值才能获得用户名。该服务与用户登录的站点位于同一服务器/域上吗?是的,它们都位于同一域肯定是一个好建议,我的反问题是:有没有办法在不修改现有web服务的情况下做到这一点,如果您的Web服务只接收用户名,并且仅返回基于用户名的信息,那么您可能别无选择,因为这里存在严重的安全/设计缺陷。另一方面,无论您选择使用Guid还是加密用户名,它仍然是一个字符串值,因此不会破坏WSDL,您所要做的就是更改WebService的内部逻辑在服务器上加密,像上面所述将其传递给JS,然后在web服务中解密,怎么样?你能详细说明一下这样做的安全性吗?是的,你可以用加密来做这样的事情。但是-然后您应该确保加密的数据不会被重复使用-例如,也要加密时间戳,并且在解密时,检查时间戳是否在最后X分钟内。否则,有人可能会窃取加密的用户名一次,然后继续使用它来伪造身份验证。感谢您的帮助,这是我们最终将使用的解决方案