我有一个使用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身份验证在任何其他身份验证之前,并且无法覆盖。
有没有办法实现这个目标?
答案 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(或打开属性资源管理器)。启用匿名身份验证。
现在,您可以自由使用Authorize
和AllowAnonymous
属性。它们非常简单,Authorize
表示用户需要获得授权才能访问操作或控制器,AllowAnonymous
意味着相反。如果未经授权的用户尝试使用Authorize
属性访问控制器或操作,则会将其重定向到登录页面。如果您将Authorize
放在控制器上,它将应用于所有控制器的操作,但AllowAnonymous
除外。
答案 2 :(得分:0)
web.config
。
为了达到预期的结果AllowAnonymous
和[Authorize]
(可能还需要一些自定义授权属性)。
要执行的步骤:
确保IIS同时为Web应用程序/网站配置了匿名身份验证和 Windows身份验证
所有控制器都应使用[Authorize]
属性。如果所有都继承自公共控制器类(例如BaseController / BaseApiController),则可以轻松实现这一点。 E.g:
[Authorize]
public class BaseController : System.Web.Mvc.Controller
{
}
[Authorize]
public class BaseApiController : System.Web.Http.ApiController
{
}
将[AllowAnonymous]
属性添加到应该是匿名的所有操作。 E.g:
[RoutePrefix("Api/Anonymous")]
[Authorize]
public class AnonymousController : ApiController
{
[HttpGet]
[Route("GetServiceStatus")]
[AllowAnonymous]
public string GetServiceStatus()
{
return "OK";
}
}