Использовать анонимную проверку подлинности в 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";
        }
    }