7

我想将 Web 服务与 Ajax 一起使用。使用 ajax 调用 web 服务时,安全性的最佳方法是什么?我想防止远程调用应用程序。

例如,我有以下网络服务:

[WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class Users : System.Web.Services.WebService
    {

        [WebMethod]
        public List<User> GetUsers()
        {
            List<User> listUsers = new List<User>();
            User user = new User();
            user.Id = 1;
            user.Name = "John";

            User user2 = new User();
            user2.Id = 2;
            user2.Name = "Martin";


            listUsers.Add(user);
            listUsers.Add(user2);

            return listUsers;
        } 
    }
}

我用 jquery ajax 调用 web 服务:

<script type="text/javascript">
    $(function () {

        getUsers();


        function getUsers() {

            $.ajax({
                type: "POST",

                url: "Webservices/Users.asmx/GetUsers",

                data: "{}",

                contentType: "application/json; charset=utf-8",

                dataType: "json",

                success: function (response) {

                    var users = response.d;

                    $.each(users, function (index, user) {

                        console.log(user.Name);

                    });

                },

                failure: function (msg) {
                }
            });
        }
    });
</script>
4

3 回答 3

10

没有最好的方法,答案总是it depends,尽管它非常无用。例如,您可以使用表单身份验证。如果您使用 Web 服务的 Web 应用程序和 Web 服务是同一部分ASP.NET application,则浏览器可以为每次调用 Web 服务时无缝地发送表单身份验证票 (cookie)。

在配置文件中,您可以拥有

<authorization>
        <deny users="?" />
</authorization>

这将拒绝匿名用户的访问,这也将涵盖 Web 服务。换句话说,除非用户登录并使用票证获得有效的 cookie,否则无法使用服务。当然,您必须HTTPS. 否则,中间的任何人都可以获取标头中的 cookie 并调用您的服务。

最后,绝对不能确保没有人在您的应用程序之外调用 Web 服务。上述方法确保中间没有人调用您的服务。但是没有办法确保有效的用户直接在您的应用程序之外调用服务,因为 Web 服务调用者是 JavaScript,并且您在 JavaScript 中构建的任何安全性都可以通过查看脚本甚至查看浏览器之间的流量。任何有点技术的最终用户都将能够重放请求或修改请求并使用有效凭据提交到您的 Web 服务。

编辑:-

以下是您正在寻找启用 FormsAuthentication 的更多详细信息。

(1) 在Web.config, 下<system.web>, 确保你有这个。

<authentication mode="Forms">
     <forms loginUrl="Login.aspx" defaultUrl="~/" />
</authentication>
<authorization>
     <deny users="?" />
</authorization>

这将确保所有未经身份验证(匿名)的用户都被重定向到 Login.aspx。

(2)Login.aspx使用您的登录逻辑实现以获取用户 ID 和密码,并根据数据库或其他方式验证它们。一旦验证成功,即用户输入的 ID 和密码与您在数据库中的匹配,可能会在登录按钮单击处理程序中,设置票证。

protected void Button1_Click(object sender, EventArgs e)
{
    // Do all your login logic here
    // once user ID and password entered by the user are okay, call this

    string ticket = FormsAuthentication.Encrypt(
                        new FormsAuthenticationTicket("userId", false, 15));
    HttpCookie FormsCookie = new HttpCookie(
               FormsAuthentication.FormsCookieName, ticket) { HttpOnly = true };
    HttpContext.Current.Response.Cookies.Add(FormsCookie);
}

(3)PrincipalPermissionAttribute像这样添加到web方法中。

public class Users : System.Web.Services.WebService
{
    [PrincipalPermissionAttribute(SecurityAction.Demand)]
    [WebMethod]
    public List<User> GetUsers()
    {
        // Same code as what you have now
    }
}

如果您现在转到任何页面,您将被重定向到 login.aspx,您需要在其中输入用户 ID 和密码并登录。登录时,将创建表单身份验证 cookie 并将其写入响应。从那时起,对您的应用程序的所有请求都将带入 cookie(浏览器将为您执行此操作)。在不登录的情况下,如果您直接访问 Web 服务,您仍然会被重定向到登录页面。正如我在原始答案中提到的那样,登录用户仍然可以直接访问 Web 服务。如果 JavaScript 可以做某事,那么用户也可以做同样的事情。

顺便说一句,Web 服务 (asmx) 是一种已弃用的技术。

于 2013-07-07T14:26:54.913 回答
2

这是一个非常重要的讨论话题。可以有很多方法来做到这一点。

我们个人将服务堆栈用于 API,并在访问 API 时使用密钥。Key 是一个对客户端和服务器保持相同的 guid。如果客户端和服务器是同一个系统,那么发布密钥不会有任何问题。

这里给出了一个非常详细的安全方法 http://www.stormpath.com/blog/secure-your-rest-api-right-way http://codebetter.com/johnvpetersen/2012/04/02/making-你的asp-net-web-apis-secure/

还有更多示例 使用 PHP/MYSQL 构建安全公共 API

于 2013-07-10T07:05:54.260 回答
1

您可以做的一件事是在构建页面时将一次性令牌放入您的页面中,然后在您的 AJAX 调用期间发布该令牌,以帮助阻止浏览器外部的调用。一个简单的实现是一个包含一堆随机值(可能是 32 个字母数字或类似的)的数据库表。当您构建页面时,从表中检索一个值并将其放入您的页面 - 当您发布 AJAX 表单时,请包含该值。

在服务器端,确保值存在于表中,然后将其从表中删除。

如果使用该值再次调用该服务,它将失败,因为该值不再在表中。

这意味着为了生成有效的令牌,您必须首先获取页面,然后您只能使用该令牌一次。

您可以在其中放置额外的检查,例如 IP 地址、用户代理、cookie 值、到期日期等,并执行诸如使用密钥散列值或其他隐蔽安全方法之类的操作。

最后,正如巴德里指出的那样,如果有人真的想要通过简单地手动创建浏览器将为 AJAX 调用发出的 HTTP 请求,所有这些都可以被欺骗。您能做的最好的事情是确保只有有效的用户才能调用服务(不管他们使用的客户端技术如何),这是通过传统的表单身份验证来完成的。

于 2013-07-09T20:17:34.763 回答