我有以下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调用webservice:
<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>
解决方法
在配置文件中,您可以拥有
<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)是一种弃用的技术.