1

我有一个 asp.net Web 应用程序,在其中我使用几个我们的服务来服务几个 ajax 请求。问题是如何确定对应的调用是否来自我服务过的页面。我在我的页面中使用表单身份验证。有什么方法可以授权用户通过相同的表单身份验证调用 weservice。

4

2 回答 2

1

这让我想起了一个我已经回答过的老问题。您的场景不同,但根本问题仍然相同:如果您从 Web 表单调用 Web 服务,如何与表单共享身份验证数据?

对此没有简单且形式接近的解决方案。您可以考虑在 Web 服务中实现 WS-Security,并在检查用户是否获得授权后让Web 窗体针对 Web 服务进行身份验证。

Web 服务不会共享有关用户登录的信息,除非作为参数方法显式传递(即。void PerformAction(string userId, ...)),但请记住,在这种情况下,视角会发生巨大变化。

这是我想到的最好的想法,但是,请记住,要么您重新设计您的 Web 服务,要么您无法让用户生成的客户端(即针对您的 WSDL 编译的桌面应用程序)使用您的服务。

[添加] 既然您已经更详细地解释了您的场景,那么软件工程中令人兴奋的部分就来了 :)

正如我在评论中所说,您有多种选择,例如:

  1. 将用户名/密码存储在页面标记中(在 Javascript 变量中)并让 JQuery 将它们作为 Web 服务的参数发送。然后,WS 将根据该数据对请求进行身份验证。不推荐,因为如果有人可以访问用户缓存,密码就会被利用(有更简单的方法可以在共享/公共计算机上窃取某人的密码,我不会讨论它们),还因为如果您打算从纯 HTTP 切换到 HTTPS安全身份验证,那么您也必须保护 Web 服务
  2. 让Web 应用程序生成对 Web 服务有效的身份验证令牌。这个想法听起来是这样的:首先,在 webapp 和 web 服务之间有一个共享对象(就像Application集合中的对象),或者,如果 webapp 和 web 服务在不同的服务器上,则使用 DBMS;然后,对于每个 webapp 的成功身份验证,生成一个唯一的令牌(会话 ID 可以)并将其存储在将传递给 web 服务的 JS 变量中;最后,当调用 Web 服务时,检查该共享对象令牌是否有效(即用户已通过身份验证并仍然登录,有权访问该 Web 服务,因此身份验证和授权),否则拒绝
于 2011-01-05T07:05:48.973 回答
0

由于您正在进行论坛身份验证,因此您可以在 WebMethod 中执行类似的操作

If Not HttpContext.Current.User.Identity.IsAuthenticated Then
    Return Nothing
End If

但是,如果您正在执行 GET,则抛出异常可能会更好,这样空结果就不会在客户端缓存。

于 2011-01-27T16:30:20.640 回答