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

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

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

有帮助吗?

解决方案

好吧,因为它是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标准中进行选择。其中最简单的是基本身份验证,但您应使用此功能因为用户名/密码未加密(仅限base64编码),因此通过SSL。下一步是摘要式身份验证,不需要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实现公开角色。

其他提示

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

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

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

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

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

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

您可以通过从Machine.config

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

更新: Web服务身份验证 - 最佳做法? 如果您的用户具有用户名/密码,则可以通过HTTPS使用HTTP基本身份验证。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top