【发布时间】:2012-11-01 23:50:16
【问题描述】:
在我目前正在开发的应用程序中,我们使用 ASP.Net 表单身份验证来授予用户进一步访问该站点的权限。该站点面向移动用户,因此我们试图尽可能地脱离服务器,并利用 KnockoutJS 进行 Web 服务调用并加载数据,以便用户可以查看它。
现在 web 服务(使用 GET 方法的 REST 服务)需要用户名才能加载特定于该用户的数据。我在服务器端 (ASP.net) 上有这些信息,我可以轻松访问 User.Identity.Name 或直接访问表单身份验证 cookie 并提取信息。
我的问题是我需要从服务器获取用户名到客户端,以便可以进行服务调用。我已经考虑过安全地执行此操作,但到目前为止还一片空白。目前我将用户名作为 url 参数传递并使用 JavaScript 解析它,并检查 Page_Load 方法以验证 url 中的用户名与登录用户匹配。
我需要一种方法来安全地将用户名从 ASP.Net 传递到客户端 JavaScript,该用户名已使用表单对用户进行身份验证,以便我可以进行 REST Web 服务调用。
编辑:所以在谷歌搜索并与我的团队负责人会面后,我认为我们将使用类似于此示例的 OAuth 实现:
http://www.c-sharpcorner.com/UploadFile/surya_bg2000/secure-wcf-restful-service-using-oauth/
对于其他任何寻找相同答案的问题,我发现这个问题对理解 OAuth 非常有帮助:
What's the point of a timestamp in OAuth if a Nonce can only be used one time?
假设一切都正确实施,是否会更安全(完全安全、安全还是更不安全?)而不是通过如下所述的 ASP 标签传递生成的签名?
编辑 2:经过更多的审查和更多的搜索,我们最终决定了一个框架和方法来完成这项工作。事实证明 OAuth 不一定是这里的答案,这个问题:
But Seriously.... Example of ASP.NET WebAPI implementation including OAuth
在弄清楚如何进行这项工作方面也提供了很多帮助。我们最终要做的是生成签名并放入 javascript 并像这样进行调用。签名将是时间敏感的,并且每次用户加载页面时都会重新生成,非常像 OAuth,但我们没有实现完整的规范。
TL:DR 最终的解决方案是生成一个哈希签名并通过 ASP 服务器标记 将其放在页面上,并使用它来验证服务调用
【问题讨论】:
-
服务是否与您的用户登录的站点位于同一服务器/域上?
-
是的,它们都将驻留在同一个域中
标签: javascript asp.net forms authentication knockout.js