从MVC 4 Project授权ASMX .NET Web服务的正确方法

Jim*_*mbo 10 asp.net asp.net-mvc web-services asmx asp.net-mvc-4

我有一个ASP.NET MVC应用程序,它具有.asmx Web服务

我编写了一个动作过滤器属性,我想在Web服务上的Web方法上使用,检查UserID和Password的Request标头,如果无效或不存在则抛出未经授权的响应代码.

但是,他们似乎没有被召唤!断点不会受到打击.

首先,使用MVC属性是一种可接受的方式来授权在ASMX Web服务上调用的Web服务吗?

其次,是否有更好/更有效的方式来授权Web服务方法调用?

Dav*_*ich 7

在回答您的第一个问题时,ASMX Web服务无法触发MVC过滤器和Web API过滤器.

  1. 操作过滤器是MVC管道的一部分,在执行控制器(或API控制器)上的操作方法之前(或之后)触发.它们只能在MVC框架中使用.

    Action Filter覆盖MVC Controller(OnActionExecuting)上的虚方法.由于只有MVC控制器具有此类方法,并且只有MVC管道检查它们

  2. 更糟糕的是,ASMX服务默认使用SOAP协议而不是HTTP协议.SOAP服务无法访问HTTP上下文(例如HttpContext.Current.User)或HTTP框架.

    可以将Web服务配置为使用HTTP协议.但是,即便如此,MVC的特定属性也无济于事.


验证传统ASMX服务的方法

  • 理想的方法是向MVC 4项目添加服务引用,从安全的Action Method或Web API方法调用ASMX方法,就像任何类库方法一样.[Authorize]

    这样,您就可以利用MVCWeb API身份验证过滤器.

  • 如果您希望直接保护ASMX服务,可以HttpContext.Current.User通过将ASMX服务配置为使用HTTP协议来检查表单身份验证.

在你的web.config中

<location path="SecuredMethod.asmx">
  <system.web>
    <webServices>
      <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
      </protocols>
    </webServices>
  </system.web>
</location> 
Run Code Online (Sandbox Code Playgroud)