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

Jon*_*Jon 15 security iis web-services asmx

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

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

有没有其他方法可以在IIS之外执行此操作,也许使用C#.net?

Dre*_*rsh 39

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

步骤#1 - 通过.config管理资源

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

<location path="MyWebService.asmx">
    <system.web>
        <!-- resource specific options will go here -->
    </system.web>
</location>
Run Code Online (Sandbox Code Playgroud)

第2步 - 验证您的用户

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

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

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

<authentication mode="Windows" />
Run Code Online (Sandbox Code Playgroud)

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

第3步 - 保护资源

保护资源的最简单方法是基本上说:"不要让那些没有成功通过某种方式验证这个资源的人".这是使用以下授权配置完成的:

<authorization>
    <deny users="?" />
</authorization>
Run Code Online (Sandbox Code Playgroud)

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

<authorization>
    <deny users="*" />
    <allow users="jdoe, msmith" />
</authorization>
Run Code Online (Sandbox Code Playgroud)

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

<authorization>
    <deny users="*" />
    <allow roles="My Service Users" />
</authorization>
Run Code Online (Sandbox Code Playgroud)

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