我写了一个非常简单的asmx web服务。我在aspx页面中设置了一个脚本管理器,并通过JavaScript调用Web服务。一切都很好:
function CallMyWebService(sender,args){
MyClass.WebService1.HelloWorld(args._value.toString(),1,OnSuccess,OnFail,sender._id.toString();
}
function OnSuccess(returnStringFromWebService,userContext){
alert(returnStringFromWebService);
}
function OnFail(returnString){
alert(returnString);
}
...
public class WebService1: System.Web.Services.WebService
{
[WebMethod()]
public string HelloWorld(string prefixText, int count)
{
return prefixText;
}
}
问题是类名,asmx文件名和方法名都可以通过“view source”看到。我考虑过RESTful Web服务,但是如果你在项目中放入一个.svc文件(而不是.asmx文件),那么调用是类似的,你可以再次在项目中看到类名等等。
这里有安全问题吗?有没有什么方法可以通过ASP.NET中的JavaScript调用Web服务,而不会暴露这么多?如果RESTful是答案?我希望Web服务(asmx或svc)与aspx文件在同一解决方案中。
提前谢谢。
答案 0 :(得分:3)
不要过于担心暴露您的API。嗅探器将能够嗅探您的呼叫并自行呼叫。只要确保如果他们自己调用它们,他们只能做他们的用户/会话允许他们做的事情。
答案 1 :(得分:0)
不要担心公开您的服务的网址。没关系。
如果您担心将某些敏感数据暴露给未经过身份验证的人,您可以随时更改您的装饰者:
[WebMethod]
为:
[WebMethod(true)]
这样您就可以在Session
来电中引用WebMethod
变量了。然后,您可以确保该请求来自成功登录并具有执行该特定WebMethod
内所执行的任何操作所需的访问级别的人。
至少,您可以获取当前用户的用户名并将其记录在某处(数据库,日志文件,事件日志等),以便您知道谁正在尝试访问哪些内容。这对于调试WebMethod
中的问题很有用,尤其是如果您在同一页面上具有不同权限级别的用户。