我有一个C#.net Web服务,我需要限制对其的访问。我已经要求我的消费者使用用户名和密码来调用该服务。但是,是否有办法限制对实际asmx页面和WSDL的访问?我需要通过用户名/密码和IP地址来限制对Web服务的访问。如果用户没有正确的凭据,则我不希望他们知道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身份验证,我强烈建议您充分利用它,因为它确实是设置的最简单选择。但是,如果您的服务是通过Internet访问的,则Windows身份验证并不是真正的选择,您需要从Web标准中进行选择。其中最简单的是Basic Authentication,但是您应该仅通过SSL使用它,因为用户名/密码未加密(仅base64编码)。下一步是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管理该组中的哪些用户。但是,如果您使用的安全性实现通过其IPrincipal实现公开了角色,则该功能也适用于非Windows身份验证。

10-07 13:11
查看更多