3

在我目前正在开发的应用程序中,我们使用 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 非常有帮助:

如果 Nonce 只能使用一次,那么 OAuth 中的时间戳有什么意义?

假设一切都正确实施,是否会更安全(完全安全,安全,还是更不安全?)而不是通过 ASP 标签传递生成的签名,如下所述?

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

但说真的.... ASP.NET WebAPI 实现示例,包括 OAuth

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

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

4

3 回答 3

2

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

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

现在你可以在你的 JS 中引用它。

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

于 2012-11-13T14:43:11.857 回答
1

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

如果它已在服务器端验证(在您的情况下,这必须来自 WCF Web 服务,因为 ASMX 不能很好地处理 REST),那么您可以确定它是正确的 - 加上您已经在客户端。

编辑:正如 Knaģis 指出的那样,您可以使用 ASPX 标签获取它,假设该页面是 ASPX 页面而不是 HTML。

于 2012-11-13T14:43:47.777 回答
0

If you just want to have the username in the client side, the other answers explain how to do this.
But as you stated, this IS a security risk. Someone can modify the data on the client and impersonate another user.

The correct way to do this:

  1. After a user successfully logs in, a Guid is issued which uniquely identifies this user.
  2. The Guid is the token which is saved on the client and passed to the server not the username.
  3. All webservices receive the Guid not the username.
  4. Server has a dictionary which converts the Guid to the original username.

Another option can be to encrypt the username and pass the encrypted value to the webservice. The webservice will need to decrypt the value in order to get the username .

于 2012-11-13T14:48:48.923 回答