有没有办法限制对ASMX Web服务的访问,i.n。 asmx页面及其WSDL?

时间:2009-09-09 14:48:07

标签: web-services security iis asmx

我有一个C#.net webservice,我需要限制访问。我已经要求我的消费者使用用户名和密码来呼叫该服务。但是,有没有办法限制对实际的asmx页面和WSDL的访问?我需要通过用户名/密码和IP地址限制对webservice的访问。如果用户没有正确的凭据,我不希望他们知道Web服务中存在哪些web方法。

这可以通过IIS完成吗?我知道我可以通过IIS限制IP地址,但我还可以使用用户名/密码吗?

在IIS之外是否还有其他方法可以使用C#.net?

6 个答案:

答案 0 :(得分:38)

好吧,因为它是ASMX,所以你可以使用整个ASP.NET运行时堆栈。

步骤#1 - 通过.config

管理资源

为您想要保护的资源应用<location>标记。假设它是一个ASMX文件,您只需在web.config中执行以下操作:

<location path="MyWebService.asmx">
    <system.web>
        <!-- resource specific options will go here -->
    </system.web>
</location>

第2步 - 验证用户身份

您需要决定如何对用户进行身份验证。有几种方法可以实现这一点,并且可以使用多种身份验证标准。您需要选择最适合您的方法。

如果您使用的是Intranet并且正在使用Windows身份验证,我强烈建议您使用它,因为它确实是获取设置的最简单方法。但是,如果您的服务是通过互联网访问的,那么Windows身份验证不是一个真正的选项,您需要从Web标准中进行选择。其中最简单的是Basic Authentication,但由于用户名/密码未加密(仅限base64编码),因此通过SSL使用此选项。下一步是Digest authentication,它不需要SSL,因为用户名/密码是使用MD5哈希发送的。最终,您可以使用SSL v3与API的每个用户签发特定的客户端证书。

现在,您选择哪个安全选项决定了还需要做什么。如果您选择Windows安全性,就像将以下元素添加到我们在步骤1中开始的<system.web>元素一样简单:

<authentication mode="Windows" />

其余的安全协议将需要更多的工作。 ASP.NET不提供对Basic,Digest或SSL v3的内在支持。从技术上讲,您可以利用IIS为您执行此类身份验证,但它始终会映射到Windows用户。如果这是您的选项,则只需保留<authentication mode="Windows" />元素并相应地配置IIS。但是,如果这不是一个选项,要么是因为您根本无法控制IIS / ActiveDirectory,要么需要对自定义用户数据库进行身份验证,那么这意味着您需要连接自定义HttpModule以提供对这些安全性的支持协议

步骤#3 - 保护资源

保护资源的最简单方法是基本上说:“不要让任何未成功通过某种方式验证此资源的人”。这是使用以下授权配置完成的:

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

如果您只想允许某些用户,您可以更改为执行以下操作:

<authorization>
    <deny users="*" />
    <allow users="jdoe, msmith" />
</authorization>

另一种方法是定义角色(组),并简单地将资源锁定到一个特殊角色,您可以将要访问资源的用户放入该角色。

<authorization>
    <deny users="*" />
    <allow roles="My Service Users" />
</authorization>

这很好地映射到Windows身份验证,因为您只需设置一个Windows组,并让您的MIS团队使用ActiveDirectory管理该组中的用户。但是,该功能对于非Windows身份验证也适用,假设您使用的安全实现通过其IPrincipal实现公开角色。

答案 1 :(得分:0)

两个选项:在具有锁定权限的其他端口上创建完全不同的站点。这样做的好处是可以通过默默无闻提供一定量的“安全性”(半开玩笑......)或者您可以在您的站点(相同的端口,不同的路径)下,在不同的应用程序池中添加新的应用程序,并以这种方式分配权限。

在任何一种情况下,您的Web服务都无法与应用程序对象之类的各种ASP.NET“事物”进行对话(好吧,但它不会是同一个)。部署只是稍微困难:部署相同的二进制文件,但只包含一个Web服务文件。

答案 2 :(得分:0)

您可以使用HttpModule进行身份验证。 SSL + BasicAuthentication应该与其他工具链产生最佳的互操作性。

在HttpModule中,您可以访问该请求,并且可以拒绝未经身份验证的用户访问.asmx请求。即便如此,您也可以让他们访问WSDL。

答案 3 :(得分:0)

<add path="*.asmx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />添加到web.config文件的<httpHandlers>部分

答案 4 :(得分:-1)

您可以通过从Machine.config

中的元素中删除Documentation协议来停止显示WSDL

更新: Web Services authentication - best practices? 如果您的用户具有用户名/密码,则可以通过HTTPS使用HTTP基本身份验证。

您也可以稍微不同的方式实现它。第一次调用您的Web服务应该是身份验证方法。客户端验证并接收身份验证令牌。此令牌应呈现给您的Web服务公开的所有其他方法。

答案 5 :(得分:-1)

我不知道这对您有多实用,但您可以考虑升级到WCF。 WCF完全向后兼容ASMX Web服务,并允许您通过定义MEX(元数据交换)端点来控制是否公开WSDL。没有MEX端点,没有WSDL。