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

Posted

技术标签:

【中文标题】有没有办法限制对 ASMX Web 服务的访问,即 asmx 页面及其 WSDL?【英文标题】:Is there a way to restrict access to an ASMX Webservice, i.e. the asmx page and its WSDL? 【发布时间】:2009-09-09 14:48:07 【问题描述】:

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

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

在 IIS 之外还有其他方法可以做到这一点,也许使用 C#.net?

【问题讨论】:

【参考方案1】:

好吧,因为它是 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 身份验证,我强烈建议您利用它,因为它确实是最简单的设置选项。但是,如果您的服务是通过 Internet 访问的,那么 Windows 身份验证就不是一个真正的选择,您需要从 Web 标准中进行选择。其中最简单的是Basic Authentication,但您应该在 SSL 上使用它,因为用户名/密码未加密(仅 base64 编码)。下一步是Digest authentication,它不需要 SSL,因为用户名/密码是使用 MD5 散列发送的。最后,您可以使用SSL v3,向您的 API 的每个用户颁发特定的客户端证书。

现在,您为安全选择的选项决定了还需要做什么。如果您选择 Windows 安全性,只需将以下元素添加到我们在第 1 步开始的 &lt;system.web&gt; 元素中:

<authentication mode="Windows" />

其余的安全协议将需要更多的工作。 ASP.NET 不提供对 Basic、Digest 或 SSL v3 的内在支持。从技术上讲,您可以利用 IIS 为您执行这种类型的身份验证,但它总是会映射到 Windows 用户。如果这对您来说是一个选项,那么只需保留 &lt;authentication mode="Windows" /&gt; 元素并相应地配置 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 管理该组中的哪些用户。但是,假设您使用的安全实现通过其 IPrincipal 实现公开角色,该功能也适用于非 Windows 身份验证。

【讨论】:

这真是一个很好的答案。但是,我错过了一件事:我需要将授权规则存储在数据库中,因此我不能通过 web.config 使用声明式方法。目前,我在每个 Web 方法中都有一些用于这些检查的代码(例如“如果(!this.isauthorized())返回“未授权!”)。有什么想法可以删除这些并在一个地方进行检查吗?是否有可能我可以使用的事件,可能是通过 HTTP 处理程序等? 如果对 Windows 活动目录进行摘要式身份验证用户凭据检查。当我们为外部用户设计 Web 服务时,我如何使用摘要身份验证针对 db 验证用户凭据。【参考方案2】:

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

【讨论】:

我希望我可以升级......但不幸的是,现在这不是一个选择。 停止wcf的暴露并不代表不能调用,我还是可以通过ajax调用来调用的【参考方案3】:

您可以通过从 Machine.config 中的元素中删除文档协议来停止显示 WSDL

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

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

【讨论】:

但如果我这样做了,那么没有人能够看到 WSDL。 是的。但这可能是件好事,这取决于您是否需要合法用户查看 WSDL。 如何从基于 asmx 的 Web 服务中删除文档? 添加到 可以解决问题,请查看下面的链接以获取更多选项msdn.microsoft.com/en-us/library/4yx7be39(VS.71).aspx【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

你能给我更多的信息吗?也许一个如何做到这一点的例子?听起来很有希望.. 当然,但是 atm,直到星期一,我才离一台装有 VS 的机器很近。这很简单,但我脑子里并没有全部可用。 g【参考方案6】:

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

【讨论】:

似乎没有任何区别。 asmx 文件仍然可以浏览。

以上是关于有没有办法限制对 ASMX Web 服务的访问,即 asmx 页面及其 WSDL?的主要内容,如果未能解决你的问题,请参考以下文章

使浏览器无法访问 Web 服务?

访问asmx Web服务时出现错误请求

项目中使用WCF替换asmx Web service总结

iOS 应用程序的 WCF 或 Web 服务 (.asmx)?

仅通过localhost限制执行

无法在 iOS 中访问 Web 服务