22

我有一个使用 Windows 身份验证的 MVC4 Web 应用程序,它位于我的 web.config 中,
<authentication mode="Windows" /> 并且工作正常,一切正常。

但是现在我需要一个控制器(实际上是一个 Web API 控制器),它应该可以从第三方组件匿名访问。问题是每次我想调用此方法时,它都会请求用户凭据。

我尝试将AllowAnonymous属性放入控制器和方法,但没有成功。

[AllowAnonymous] public bool Get(string Called, string Calling, string CallID, int direction)

我在启用匿名身份验证和 Windows 身份验证的情况下检查了 IIS Express 和 IIS 8。

似乎 Windows 身份验证先于任何其他身份验证,并且不能被覆盖。

有没有办法做到这一点?

4

3 回答 3

19

将此添加到您的 Web.config。在这里,我的控制器被命名为“WebhookController”。

<location path="Webhook">
  <system.web>
    <authorization>
      <allow users="*"/>
    </authorization>
  </system.web>
</location>

有关更多信息,请参阅此知识库文章。

编辑 - 正如 Erik 下面提到的,在 MVC 应用程序中,您不应该使用 web.config<authorization>标签来保证安全。相反,使用[Authorize]属性。这样做将使您的[AllowAnonymous]属性正常工作。您可以在此处阅读有关此内容的更多信息。

于 2013-03-18T20:59:51.317 回答
7

接受的答案似乎已过时,所以...

在您的 web.config 中,删除这些行:

<authorization>
  <deny users="?" />
</authorization>

在解决方案资源管理器中,单击您的项目,然后单击 f4(或打开属性资源管理器)。启用匿名身份验证。

现在您可以自由使用AuthorizeAllowAnonymous属性了。它们非常简单,Authorize意味着用户需要获得授权才能访问操作或控制器,AllowAnonymous反之亦然。如果未经授权的用户尝试使用该Authorize属性访问控制器或操作,他们将被重定向到登录页面。如果您戴上Authorize控制器,它将适用于控制器的所有操作,除了带有AllowAnonymous.

于 2016-12-22T19:23:57.917 回答
1

web.config不应按此处所示触摸。

为了达到预期的结果AllowAnonymous,并且[Authorize](如果需要,可能还有一些自定义授权属性)应该被使用。

要执行的步骤:

  1. 确保 IIS为 Web 应用程序/网站配置了匿名身份验证Windows 身份验证

  2. 所有控制器都应该使用[Authorize]属性。如果都继承自一个通用控制器类(例如 BaseController / BaseApiController),这可以很容易地实现。例如:

    [Authorize]
    public class BaseController : System.Web.Mvc.Controller
    {
    
    }
    
    
    [Authorize]
    public class BaseApiController : System.Web.Http.ApiController
    {
    
    }
    
  3. [AllowAnonymous]为所有应该是匿名的操作添加属性。例如:

    [RoutePrefix("Api/Anonymous")]
    [Authorize]
    public class AnonymousController : ApiController
    {
        [HttpGet]
        [Route("GetServiceStatus")]
        [AllowAnonymous]
        public string GetServiceStatus()
        {
            return "OK";
        }
    }
    
于 2018-02-13T16:26:12.483 回答