当整个应用程序使用Windows身份验证时,在单个控制器上使用MVC 4中的匿名身份验证

时间:2013-02-26 11:20:33

标签: asp.net-mvc-4 windows-authentication

我有一个使用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身份验证在任何其他身份验证之前,并且无法覆盖。

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:15)

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

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

See this KB article for more info.

修改   - 正如Erik在下面提到的,在MVC应用程序中,您不应该使用web.config <authorization>标记来提高安全性。相反,请使用[Authorize]属性。这样做可以使[AllowAnonymous]属性正常工作。 You can read more about this here.

答案 1 :(得分:4)

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

在您的web.config中,删除以下行:

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

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

现在,您可以自由使用AuthorizeAllowAnonymous属性。它们非常简单,Authorize表示用户需要获得授权才能访问操作或控制器,AllowAnonymous意味着相反。如果未经授权的用户尝试使用Authorize属性访问控制器或操作,则会将其重定向到登录页面。如果您将Authorize放在控制器上,它将应用于所有控制器的操作,但AllowAnonymous除外。

答案 2 :(得分:0)

不应按指示here触及

web.config

为了达到预期的结果AllowAnonymous[Authorize](可能还需要一些自定义授权属性)。

要执行的步骤:

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

  2. 所有控制器都应使用[Authorize]属性。如果所有都继承自公共控制器类(例如BaseController / BaseApiController),则可以轻松实现这一点。 E.g:

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

    [RoutePrefix("Api/Anonymous")]
    [Authorize]
    public class AnonymousController : ApiController
    {
        [HttpGet]
        [Route("GetServiceStatus")]
        [AllowAnonymous]
        public string GetServiceStatus()
        {
            return "OK";
        }
    }