代码之家  ›  专栏  ›  技术社区  ›  Jon

是否有方法限制对asmx Web服务的访问,即asmx页面及其WSDL?

  •  15
  • Jon  · 技术社区  · 15 年前

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

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

    是否有其他方法可以在IIS之外执行此操作,可能使用C.NET?

    6 回复  |  直到 9 年前
        1
  •  38
  •   Alex    9 年前

    好吧,因为它是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-验证用户身份

    您需要决定如何对用户进行身份验证。有几种方法可以做到这一点,还有几种可以利用的身份验证标准。你需要选择适合你的方法。

    如果你在一个内部网,并且使用的是Windows身份验证,我强烈建议利用它,因为它确实是获得设置的最简单的选项。但是,如果您的服务是通过Internet访问的,那么Windows身份验证实际上不是一个选项,您需要从Web标准中进行选择。最简单的是 Basic Authentication 但是你应该 只有 由于用户名/密码未加密(仅对base64编码),因此在SSL上使用此选项。下一步是 Digest authentication 它不需要SSL,因为用户名/密码是使用MD5哈希发送的。为了最终的你可以去 SSL v3 向API的每个用户颁发特定的客户端证书。

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

    <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实现公开角色。

        2
  •  1
  •   Robert Giesecke    15 年前

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

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

        3
  •  0
  •   popester    15 年前

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

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

        4
  •  0
  •   Aamir D    9 年前

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

        5
  •  -1
  •   Christian Hayter    15 年前

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

        6
  •  -1
  •   Community CDub    8 年前

    通过从machine.config中的元素中删除文档协议,可以停止显示WSDL。

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

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