Использовать анонимную проверку подлинности в MVC4 на одном контроллере, когда все приложение использует Windows Authenticaion
У меня есть веб-приложение MVC4, которое использует проверку подлинности Windows, то есть в web.config У меня есть <authentication mode="Windows" />
И это прекрасно работает, и все в порядке.
Однако теперь мне нужен контроллер (фактически API-интерфейс API), к которому следует обращаться анонимно от стороннего компонента. Проблема в том, что каждый раз, когда я хочу вызвать этот метод, он запрашивает учетные данные пользователя.
Я попытался поместить атрибут AllowAnonymous
в контроллер и методы, но это не удалось.
[AllowAnonymous]
public bool Get(string Called, string Calling, string CallID, int direction)
Я проверил как IIS Express, так и IIS 8 с анонимной аутентификацией и аутентификацией Windows.
Кажется, что проверка подлинности Windows предшествует любой другой аутентификации и не может быть переопределена.
Есть ли способ сделать это?
Ответы
Ответ 1
Добавьте это в свой Web.config. Здесь мой контроллер называется "WebhookController".
<location path="Webhook">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
Подробнее см. эту статью в блоге.
Edit
- Как упоминалось ранее в Erik, в приложениях MVC вам не следует использовать теги web.config <authorization>
для обеспечения безопасности. Вместо этого используйте атрибуты [Authorize]
. Это позволит вашим атрибутам [AllowAnonymous]
работать правильно. Подробнее об этом вы можете прочитать здесь.
Ответ 2
Принятый ответ кажется устаревшим, поэтому...
В вашем web.config удалите эти строки:
<authorization>
<deny users="?" />
</authorization>
В проводнике решений щелкните проект, затем нажмите f4 (или откройте проводник свойств). Включить анонимную аутентификацию.
Теперь вы можете использовать атрибуты Authorize
и AllowAnonymous
. Они довольно просты, Authorize
означает, что пользователь должен быть авторизован для доступа к действию или контроллеру, AllowAnonymous
означает противоположное. Если неавторизованный пользователь пытается получить доступ к контроллеру или действию с атрибутом Authorize
, они будут перенаправлены на страницу входа. Если вы поместите Authorize
на контроллер, он применим ко всем действиям контроллера, кроме тех, у которых есть AllowAnonymous
.
Ответ 3
web.config
не следует касаться, как указано здесь.
Для достижения желаемого результата AllowAnonymous
и [Authorize]
(и, возможно, должен использоваться какой-либо пользовательский атрибут авторизации).
Шаги, которые необходимо выполнить:
-
Убедитесь, что IIS имеет анонимную аутентификацию и проверку подлинности Windows, настроенную для веб-приложения/веб-сайта
-
Все контроллеры должны использовать атрибут [Authorize]
. Это может быть легко достигнуто, если все наследуются от общего класса контроллера (например, BaseController/BaseApiController). Например:.
[Authorize]
public class BaseController : System.Web.Mvc.Controller
{
}
[Authorize]
public class BaseApiController : System.Web.Http.ApiController
{
}
-
Добавить атрибут [AllowAnonymous]
для всех действий, которые должны быть анонимными. Например:.
[RoutePrefix("Api/Anonymous")]
[Authorize]
public class AnonymousController : ApiController
{
[HttpGet]
[Route("GetServiceStatus")]
[AllowAnonymous]
public string GetServiceStatus()
{
return "OK";
}
}