Переопределить проверку подлинности форм ASP.NET для одной страницы - PullRequest
5 голосов
/ 03 июня 2009

В нашем приложении ASP.NET MVC мы автоматически перенаправляем пользователей на страницу входа в систему через секцию <authentication> в <system.web>, когда они пытаются получить доступ только к авторизованной странице. Проблема заключается в том, что одно действие в середине приложения, предназначенное для использования инструментом, должно возвращать прямой HTTP 401-ответ при плохом доступе. Как я могу вернуть настоящий код HTTP 401 без перенаправления для этого конкретного действия?

Ответы [ 3 ]

6 голосов
/ 03 июня 2009

Следующее решение работает, хотя я совсем не уверен, что оно оптимально:

public class HttpAuthenticationRequiredResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.StatusCode = 401;
        response.AddHeader("WWW-Authenticate", "Basic realm=\"whatever\"");
        response.Flush();
        response.Close();
    }
}

Затем вы можете вернуть приведенный выше результат вместо HttpUnauthorizedResult, чтобы сгенерировать необходимый код 401. Однако, мне это кажется довольно клёвым.

4 голосов
/ 03 июня 2009

Вы можете иметь отдельные <system.web> разделы для отдельных путей. Вот пример:

<configuration>
  <location path="Foo/Bar.aspx">
    <system.web>
      <authorization>
        <allow roles="GoodGuys" />
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>
</configuration>

В этом случае страница «Foo / Bar.aspx» разрешена пользователям с ролью GoodGuys, но запрещена всем остальным.

В вашем случае вы можете разрешить все без аутентификации:

<configuration>
  <location path="Foo/Bar.aspx">
    <system.web>
      <authentication mode="None" />
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
</configuration>
0 голосов
/ 21 июля 2016

Был похожий случай, когда мне нужно было вернуть что-то, что вызвало нежелательное перенаправление (в основном сообщение о том, как аутентификация не удалась, и она перенаправлялась на экран входа в систему без информации об ошибке).

Это решило проблему:

Response.SuppressFormsAuthenticationRedirect = true;
...